1 /** 2 * Copyright 2017 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <cstdio> 18 #include <iostream> 19 #include <memory> 20 21 #include <sdbusplus/bus.hpp> 22 #include <sdbusplus/message.hpp> 23 #include <sdbusplus/server.hpp> 24 25 #include "lpcsnoop/snoop.hpp" 26 27 /* 28 * Handle incoming dbus signal we care about. 29 */ 30 static int DbusHandleSignal(sd_bus_message* msg, void* data, sd_bus_error* err); 31 32 /* 33 * Get the match signal for dbus. 34 */ 35 static std::string GetMatch(void); 36 37 // Example object that listens for dbus updates. 38 class SnoopListen 39 { 40 public: 41 SnoopListen(sdbusplus::bus::bus& bus) : 42 _bus(bus), _signal(bus, GetMatch().c_str(), DbusHandleSignal, this) 43 { 44 } 45 46 private: 47 sdbusplus::bus::bus& _bus; 48 sdbusplus::server::match::match _signal; 49 }; 50 51 /* 52 * This is the entry point for the application. 53 * 54 * This application simply creates an object that registers for incoming value 55 * updates for the POST code dbus object. 56 */ 57 int main(int argc, char* argv[]) 58 { 59 auto ListenBus = sdbusplus::bus::new_default(); 60 SnoopListen snoop(ListenBus); 61 62 while (true) 63 { 64 ListenBus.process_discard(); 65 ListenBus.wait(); 66 } 67 68 return 0; 69 } 70 71 static int DbusHandleSignal(sd_bus_message* msg, void* data, sd_bus_error* err) 72 { 73 auto sdbpMsg = sdbusplus::message::message(msg); 74 75 std::string msgSensor, busName{SNOOP_BUSNAME}; 76 std::map<std::string, sdbusplus::message::variant<uint64_t>> msgData; 77 sdbpMsg.read(msgSensor, msgData); 78 79 if (msgSensor == busName) 80 { 81 auto valPropMap = msgData.find("Value"); 82 if (valPropMap != msgData.end()) 83 { 84 uint64_t rawValue = sdbusplus::message::variant_ns::get<uint64_t>( 85 valPropMap->second); 86 87 /* Print output to verify the example program is receiving values. 88 */ 89 std::printf("recv: 0x%x\n", static_cast<uint8_t>(rawValue)); 90 } 91 } 92 93 return 0; 94 } 95 96 static std::string GetMatch(void) 97 { 98 return "type='signal',interface='org.freedesktop.DBus.Properties'," 99 "member='PropertiesChanged',path='" SNOOP_OBJECTPATH "'"; 100 } 101