blob: da68133136c4192a2990a41a9d20397d481e03c7 [file] [log] [blame]
// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef HERMES_SOCKET_QRTR_H_
#define HERMES_SOCKET_QRTR_H_
#include <base/files/scoped_file.h>
#include <base/message_loop/message_loop.h>
#include "hermes/socket_interface.h"
namespace hermes {
class SocketQrtr : public SocketInterface,
public base::MessageLoopForIO::Watcher {
public:
struct PacketMetadata {
uint32_t port;
uint32_t node;
};
SocketQrtr();
void SetDataAvailableCallback(DataAvailableCallback cb) override;
bool Open() override;
void Close() override;
bool IsValid() const override { return socket_.is_valid(); }
Type GetType() const override { return Type::kQrtr; }
bool StartService(uint32_t service,
uint16_t version_major,
uint16_t version_minor) override;
bool StopService(uint32_t service,
uint16_t version_major,
uint16_t version_minor) override;
// If the metadata ptr is not null, it must point to a
// SocketQrtr::PacketMetadata instance.
int Recv(void* buf, size_t size, void* metadata) override;
int Send(const void* data, size_t size, const void* metadata) override;
private:
// base::MesageLoopForIO::Watcher methods.
void OnFileCanReadWithoutBlocking(int socket) override;
void OnFileCanWriteWithoutBlocking(int socket) override;
private:
base::ScopedFD socket_;
DataAvailableCallback cb_;
// FileDescriptorWatcher to watch QRTR socket for |CallWhenDataAvailable|.
base::MessageLoopForIO::FileDescriptorWatcher watcher_;
};
} // namespace hermes
#endif // HERMES_SOCKET_QRTR_H_