blob: 55bd4ed9cabc46d41fd361472294304f22772434 [file] [log] [blame]
/**
* Copyright 2017 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <cinttypes>
#include <cstdio>
#include <iostream>
#include <memory>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/message.hpp>
#include <sdbusplus/server.hpp>
#include "lpcsnoop/snoop.hpp"
/*
* Handle incoming dbus signal we care about.
*/
static int DbusHandleSignal(sd_bus_message* msg, void* data, sd_bus_error* err);
/*
* Get the match signal for dbus.
*/
static std::string GetMatch(void);
// Example object that listens for dbus updates.
class SnoopListen
{
public:
SnoopListen(sdbusplus::bus::bus& bus) :
_bus(bus), _signal(bus, GetMatch().c_str(), DbusHandleSignal, this)
{
}
private:
sdbusplus::bus::bus& _bus;
sdbusplus::server::match::match _signal;
};
/*
* This is the entry point for the application.
*
* This application simply creates an object that registers for incoming value
* updates for the POST code dbus object.
*/
int main(int argc, char* argv[])
{
auto ListenBus = sdbusplus::bus::new_default();
SnoopListen snoop(ListenBus);
while (true)
{
ListenBus.process_discard();
ListenBus.wait();
}
return 0;
}
static int DbusHandleSignal(sd_bus_message* msg, void* data, sd_bus_error* err)
{
auto sdbpMsg = sdbusplus::message::message(msg);
std::string msgSensor, busName{SNOOP_BUSNAME};
std::map<std::string, sdbusplus::message::variant<uint64_t>> msgData;
sdbpMsg.read(msgSensor, msgData);
if (msgSensor == busName)
{
auto valPropMap = msgData.find("Value");
if (valPropMap != msgData.end())
{
uint64_t rawValue = sdbusplus::message::variant_ns::get<uint64_t>(
valPropMap->second);
/* Print output to verify the example program is receiving values.
*/
std::printf("recv: 0x%" PRIx64 "\n", rawValue);
}
}
return 0;
}
static std::string GetMatch(void)
{
return "type='signal',interface='org.freedesktop.DBus.Properties',"
"member='PropertiesChanged',path='" SNOOP_OBJECTPATH "'";
}