gecko/hal/gonk/GonkSensorsRegistryInterface.cpp
Thomas Zimmermann fa3a3b1b24 Bug 1194721: Add registry interface and module for Gonk sensors, r=gsvelto
A system daemon can contain several services. One of them is the registry
service that manages all other services. This patch adds support for this
service in the Gonk sensors daemon.
2016-02-04 12:35:13 +01:00

213 lines
5.0 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "GonkSensorsRegistryInterface.h"
#include "GonkSensorsHelpers.h"
#include "HalLog.h"
namespace mozilla {
namespace hal {
using namespace mozilla::ipc;
//
// GonkSensorsRegistryResultHandler
//
void
GonkSensorsRegistryResultHandler::OnError(SensorsError aError)
{
HAL_ERR("Received error code %d", static_cast<int>(aError));
}
void
GonkSensorsRegistryResultHandler::RegisterModule(uint32_t aProtocolVersion)
{ }
void
GonkSensorsRegistryResultHandler::UnregisterModule()
{ }
GonkSensorsRegistryResultHandler::~GonkSensorsRegistryResultHandler()
{ }
//
// GonkSensorsRegistryModule
//
GonkSensorsRegistryModule::~GonkSensorsRegistryModule()
{ }
void
GonkSensorsRegistryModule::HandleSvc(const DaemonSocketPDUHeader& aHeader,
DaemonSocketPDU& aPDU,
DaemonSocketResultHandler* aRes)
{
static void (GonkSensorsRegistryModule::* const HandleRsp[])(
const DaemonSocketPDUHeader&,
DaemonSocketPDU&,
GonkSensorsRegistryResultHandler*) = {
[OPCODE_ERROR] = &GonkSensorsRegistryModule::ErrorRsp,
[OPCODE_REGISTER_MODULE] = &GonkSensorsRegistryModule::RegisterModuleRsp,
[OPCODE_UNREGISTER_MODULE] = &GonkSensorsRegistryModule::UnregisterModuleRsp
};
if ((aHeader.mOpcode >= MOZ_ARRAY_LENGTH(HandleRsp)) ||
!HandleRsp[aHeader.mOpcode]) {
HAL_ERR("Sensors registry response opcode %d unknown", aHeader.mOpcode);
return;
}
RefPtr<GonkSensorsRegistryResultHandler> res =
static_cast<GonkSensorsRegistryResultHandler*>(aRes);
if (!res) {
return; // Return early if no result handler has been set
}
(this->*(HandleRsp[aHeader.mOpcode]))(aHeader, aPDU, res);
}
// Commands
//
nsresult
GonkSensorsRegistryModule::RegisterModuleCmd(
uint8_t aId, GonkSensorsRegistryResultHandler* aRes)
{
MOZ_ASSERT(NS_IsMainThread());
nsAutoPtr<DaemonSocketPDU> pdu(
new DaemonSocketPDU(SERVICE_ID, OPCODE_REGISTER_MODULE, 0));
nsresult rv = PackPDU(aId, *pdu);
if (NS_FAILED(rv)) {
return rv;
}
rv = Send(pdu, aRes);
if (NS_FAILED(rv)) {
return rv;
}
Unused << pdu.forget();
return NS_OK;
}
nsresult
GonkSensorsRegistryModule::UnregisterModuleCmd(
uint8_t aId, GonkSensorsRegistryResultHandler* aRes)
{
MOZ_ASSERT(NS_IsMainThread());
nsAutoPtr<DaemonSocketPDU> pdu(
new DaemonSocketPDU(SERVICE_ID, OPCODE_UNREGISTER_MODULE, 0));
nsresult rv = PackPDU(aId, *pdu);
if (NS_FAILED(rv)) {
return rv;
}
rv = Send(pdu, aRes);
if (NS_FAILED(rv)) {
return rv;
}
Unused << pdu.forget();
return NS_OK;
}
// Responses
//
void
GonkSensorsRegistryModule::ErrorRsp(
const DaemonSocketPDUHeader& aHeader,
DaemonSocketPDU& aPDU, GonkSensorsRegistryResultHandler* aRes)
{
ErrorRunnable::Dispatch(
aRes, &GonkSensorsRegistryResultHandler::OnError, UnpackPDUInitOp(aPDU));
}
void
GonkSensorsRegistryModule::RegisterModuleRsp(
const DaemonSocketPDUHeader& aHeader, DaemonSocketPDU& aPDU,
GonkSensorsRegistryResultHandler* aRes)
{
Uint32ResultRunnable::Dispatch(
aRes,
&GonkSensorsRegistryResultHandler::RegisterModule,
UnpackPDUInitOp(aPDU));
}
void
GonkSensorsRegistryModule::UnregisterModuleRsp(
const DaemonSocketPDUHeader& aHeader, DaemonSocketPDU& aPDU,
GonkSensorsRegistryResultHandler* aRes)
{
ResultRunnable::Dispatch(
aRes,
&GonkSensorsRegistryResultHandler::UnregisterModule,
UnpackPDUInitOp(aPDU));
}
//
// GonkSensorsRegistryInterface
//
GonkSensorsRegistryInterface::GonkSensorsRegistryInterface(
GonkSensorsRegistryModule* aModule)
: mModule(aModule)
{ }
GonkSensorsRegistryInterface::~GonkSensorsRegistryInterface()
{ }
void
GonkSensorsRegistryInterface::RegisterModule(
uint8_t aId, GonkSensorsRegistryResultHandler* aRes)
{
MOZ_ASSERT(mModule);
nsresult rv = mModule->RegisterModuleCmd(aId, aRes);
if (NS_FAILED(rv)) {
DispatchError(aRes, rv);
}
}
void
GonkSensorsRegistryInterface::UnregisterModule(
uint8_t aId, GonkSensorsRegistryResultHandler* aRes)
{
MOZ_ASSERT(mModule);
nsresult rv = mModule->UnregisterModuleCmd(aId, aRes);
if (NS_FAILED(rv)) {
DispatchError(aRes, rv);
}
}
void
GonkSensorsRegistryInterface::DispatchError(
GonkSensorsRegistryResultHandler* aRes, SensorsError aError)
{
DaemonResultRunnable1<GonkSensorsRegistryResultHandler, void,
SensorsError, SensorsError>::Dispatch(
aRes, &GonkSensorsRegistryResultHandler::OnError,
ConstantInitOp1<SensorsError>(aError));
}
void
GonkSensorsRegistryInterface::DispatchError(
GonkSensorsRegistryResultHandler* aRes, nsresult aRv)
{
SensorsError error;
if (NS_FAILED(Convert(aRv, error))) {
error = SENSORS_ERROR_FAIL;
}
DispatchError(aRes, error);
}
} // namespace hal
} // namespace mozilla