2 * Copyright (C) 2012, BMW AG
4 * This file is part of GENIVI Project AudioManager.
6 * Contributions are licensed to the GENIVI Alliance under one or more
7 * Contribution License Agreements.
10 * This Source Code Form is subject to the terms of the
11 * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with
12 * this file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 * \author Christian Linke, christian.linke@bmw.de BMW 2012
17 * \file CAmNodeStateCommunicator.cpp
18 * For further information see http://www.genivi.org/.
22 #include "CAmNodeStateCommunicator.h"
27 #include "CAmControlSender.h"
28 #include "shared/CAmDltWrapper.h"
35 static DBusObjectPathVTable gObjectPathVTable;
37 CAmNodeStateCommunicator::CAmNodeStateCommunicator(CAmDbusWrapper* iDbusWrapper) :
38 mpDbusWrapper(iDbusWrapper), //
39 mpControlSender(NULL), //
40 mpDBusConnection(NULL)
42 assert(mpDbusWrapper);
43 logInfo("CAmNodeStateCommunicator::CAmNodeStateCommunicator started");
45 //save the DBusConnection
46 mpDbusWrapper->getDBusConnection(mpDBusConnection);
47 assert(mpDBusConnection!=NULL);
49 //register the path and the callback for receiving messages
50 std::string path("LifeCycleConsumer");
51 gObjectPathVTable.message_function=CAmNodeStateCommunicator::receiveCallback;
52 mpDbusWrapper->registerCallback(&gObjectPathVTable, path, this);
54 //now we need to make sure we catch the signals from the NSM:
55 dbus_bus_add_match(mpDBusConnection, "type=\'signal\',path=\'/org/genivi/NodeStateManager\'", NULL);
56 if (!dbus_connection_add_filter(mpDBusConnection, CAmNodeStateCommunicator::signalCallback, this, NULL))
58 logError("CAmNodeStateCommunicator::CAmNodeStateCommunicator not enought memory!");
59 throw std::runtime_error("CAmNodeStateCommunicator::CAmNodeStateCommunicator not enought memory!");
61 dbus_connection_flush(mpDBusConnection);
64 CAmNodeStateCommunicator::~CAmNodeStateCommunicator()
67 /** retrieves the actual restartReason
69 * @param restartReason
70 * @return E_OK on success
72 am_Error_e CAmNodeStateCommunicator::nsmGetRestartReasonProperty(NsmRestartReason_e& restartReason)
75 am_Error_e error=readIntegerProperty("RestartReason",answer);
76 restartReason=static_cast<NsmRestartReason_e>(answer);
80 /** retrieves the actual shutdownreason
82 * @param ShutdownReason
83 * @return E_OK on success
85 am_Error_e CAmNodeStateCommunicator::nsmGetShutdownReasonProperty(NsmShutdownReason_e& ShutdownReason)
88 am_Error_e error=readIntegerProperty("ShutdownReason",answer);
89 ShutdownReason=static_cast<NsmShutdownReason_e>(answer);
93 /** retrieves the actual runnuing reason
95 * @param nsmRunningReason
96 * @return E_OK on success
98 am_Error_e CAmNodeStateCommunicator::nsmGetRunningReasonProperty(NsmRunningReason_e& nsmRunningReason)
101 am_Error_e error=readIntegerProperty("WakeUpReason",answer);
102 nsmRunningReason=static_cast<NsmRunningReason_e>(answer);
106 /** gets the node state
108 * @param nsmNodeState
109 * @return NsmErrorStatus_Ok on success
111 NsmErrorStatus_e CAmNodeStateCommunicator::nsmGetNodeState(NsmNodeState_e& nsmNodeState)
114 dbus_error_init(&error);
116 uint32_t nodeStateID;
117 uint32_t returnedError;
119 DBusMessage * message = dbus_message_new_method_call(NSM_BUS_INTERFACE, NSM_PATH, NSM_INTERFACE, "GetNodeState");
123 logError("CAmNodeStateCommunicator::nsmGetNodeState dbus error:", error.message);
124 return (NsmErrorStatus_Dbus);
127 DBusMessage* reply(dbus_connection_send_with_reply_and_block(mpDBusConnection, message, -1, &error));
130 logError("CAmNodeStateCommunicator::nsmGetNodeState failed, dbus error", error.message);
131 return (NsmErrorStatus_Dbus);
134 if(!dbus_message_get_args(reply, &error, DBUS_TYPE_INT32, &nodeStateID, DBUS_TYPE_INT32, &returnedError, DBUS_TYPE_INVALID))
135 return (NsmErrorStatus_Dbus);
137 dbus_message_unref(reply);
139 nsmNodeState=static_cast<NsmNodeState_e>(nodeStateID);
140 return (static_cast<NsmErrorStatus_e>(returnedError));
143 /** gets the session state for a session and seatID
145 * @param sessionName the name of the session
146 * @param seatID the seatID
147 * @param sessionState
148 * @return NsmErrorStatus_Ok on success
150 NsmErrorStatus_e CAmNodeStateCommunicator::nsmGetSessionState(const std::string& sessionName, const NsmSeat_e& seatID, NsmSessionState_e& sessionState)
153 dbus_error_init(&error);
154 DBusMessageIter iter;
156 uint32_t returnedError;
157 int32_t BsessionState(0);
159 DBusMessage * message = dbus_message_new_method_call(NSM_BUS_INTERFACE, NSM_PATH, NSM_INTERFACE, "GetSessionState");
163 logError("CAmNodeStateCommunicator::nsmGetSessionState dbus error:", error.message);
164 return (NsmErrorStatus_Dbus);
167 dbus_message_iter_init_append(message, &iter);
169 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &sessionName))
171 logError( "CAmNodeStateCommunicator::nsmGetSessionState no more memory");
172 return (NsmErrorStatus_Dbus);
175 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &seatID))
177 logError( "CAmNodeStateCommunicator::nsmGetSessionState no more memory");
178 return (NsmErrorStatus_Dbus);
181 DBusMessage* reply(dbus_connection_send_with_reply_and_block(mpDBusConnection, message, -1, &error));
184 logError("CAmNodeStateCommunicator::nsmGetSessionState failed, dbus error", error.message);
185 return (NsmErrorStatus_Dbus);
188 if(!dbus_message_get_args(reply, &error,
189 DBUS_TYPE_INT32, &BsessionState,
190 DBUS_TYPE_INT32, &returnedError,DBUS_TYPE_INVALID))
191 return (NsmErrorStatus_Dbus);
193 dbus_message_unref(reply);
195 sessionState=static_cast<NsmSessionState_e>(BsessionState);
196 return (static_cast<NsmErrorStatus_e>(returnedError));
199 /** gets the application mode
201 * @param applicationMode
202 * @return NsmErrorStatus_Ok on success
204 NsmErrorStatus_e CAmNodeStateCommunicator::nsmGetApplicationMode(NsmApplicationMode_e& applicationMode)
207 dbus_error_init(&error);
209 uint32_t BapplicationMode(0),returnedError(0);
211 DBusMessage * message = dbus_message_new_method_call(NSM_BUS_INTERFACE, NSM_PATH, NSM_INTERFACE, "GetApplicationMode");
215 logError("CAmNodeStateCommunicator::nsmGetApplicationMode dbus error:", error.message);
216 return (NsmErrorStatus_Dbus);
219 DBusMessage* reply(dbus_connection_send_with_reply_and_block(mpDBusConnection, message, -1, &error));
222 logError("CAmNodeStateCommunicator::nsmGetApplicationMode failed, dbus error", error.message);
223 return (NsmErrorStatus_Dbus);
226 if(!dbus_message_get_args(reply, &error, DBUS_TYPE_INT32, &BapplicationMode, DBUS_TYPE_INT32, &returnedError, DBUS_TYPE_INVALID))
227 return (NsmErrorStatus_Dbus);
229 dbus_message_unref(reply);
231 applicationMode=static_cast<NsmApplicationMode_e>(BapplicationMode);
232 return (static_cast<NsmErrorStatus_e>(returnedError));
235 /** this function registers the AudioManager as shutdown client at the NSM
236 * for more information check the Nodestatemanager
237 * @param shutdownMode the shutdownmode you wish to set
238 * @param timeoutMs the timeout you need to have
239 * @return NsmErrorStatus_Ok on success
241 NsmErrorStatus_e CAmNodeStateCommunicator::nsmRegisterShutdownClient(const uint32_t shutdownMode, const uint32_t timeoutMs)
244 DBusMessageIter iter;
245 dbus_error_init(&error);
246 int32_t returnError(0);
247 std::string path = std::string(DBUS_SERVICE_OBJECT_PATH) + "/LifeCycleConsumer";
248 const char* charPath = path.c_str();
249 const char* service =DBUS_SERVICE_PREFIX;
250 DBusMessage * message = dbus_message_new_method_call(NSM_BUS_INTERFACE, NSM_PATH, NSM_INTERFACE, "RegisterShutdownClient");
254 logError( "CAmNodeStateCommunicator::nsmRegisterShutdownClient dbus error:", error.message);
255 return (NsmErrorStatus_Dbus);
257 dbus_message_iter_init_append(message, &iter);
259 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &service))
261 logError( "CAmNodeStateCommunicator::nsmRegisterShutdownClient no more memory");
262 return (NsmErrorStatus_Dbus);
265 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &charPath))
267 logError( "CAmNodeStateCommunicator::nsmRegisterShutdownClient no more memory");
268 return (NsmErrorStatus_Dbus);
271 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &shutdownMode))
273 logError( "CAmNodeStateCommunicator::nsmRegisterShutdownClient no more memory");
274 return (NsmErrorStatus_Dbus);
277 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &timeoutMs))
279 logError( "CAmNodeStateCommunicator::nsmRegisterShutdownClient no more memory");
280 return (NsmErrorStatus_Dbus);
283 DBusMessage* reply(dbus_connection_send_with_reply_and_block(mpDBusConnection, message, -1, &error));
284 dbus_message_unref(message);
288 logError( "CAmRoutingDbusSend::send failed, dbus error", error.message);
289 return (NsmErrorStatus_Dbus);
292 if(!dbus_message_get_args(reply, &error, DBUS_TYPE_INT32, &returnError,DBUS_TYPE_INVALID))
294 logError( "CAmRoutingDbusSend::send failed, dbus error", error.message);
295 return (NsmErrorStatus_Dbus);
297 dbus_message_unref(reply);
299 return (static_cast<NsmErrorStatus_e>(returnError));
303 /** this function unregisters the AudioManager as shutdown client at the NSM
305 * @param shutdownMode
306 * @return NsmErrorStatus_Ok on success
308 NsmErrorStatus_e CAmNodeStateCommunicator::nsmUnRegisterShutdownClient(const uint32_t shutdownMode)
311 DBusMessageIter iter;
312 dbus_error_init(&error);
313 int32_t returnError(0);
314 std::string path = std::string(DBUS_SERVICE_OBJECT_PATH) + "/LifeCycleConsumer";
315 const char* charPath = path.c_str();
316 const char* service =DBUS_SERVICE_PREFIX;
317 DBusMessage * message = dbus_message_new_method_call(NSM_BUS_INTERFACE, NSM_PATH, NSM_INTERFACE, "UnRegisterShutdownClient");
321 logError( "CAmNodeStateCommunicator::nsmUnRegisterShutdownClient dbus error:", error.message);
322 return (NsmErrorStatus_Dbus);
324 dbus_message_iter_init_append(message, &iter);
326 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &service))
328 logError( "CAmNodeStateCommunicator::nsmUnRegisterShutdownClient no more memory");
329 return (NsmErrorStatus_Dbus);
332 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &charPath))
334 logError( "CAmNodeStateCommunicator::nsmUnRegisterShutdownClient no more memory");
335 return (NsmErrorStatus_Dbus);
338 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &shutdownMode))
340 logError( "CAmNodeStateCommunicator::nsmUnRegisterShutdownClient no more memory");
341 return (NsmErrorStatus_Dbus);
344 DBusMessage* reply(dbus_connection_send_with_reply_and_block(mpDBusConnection, message, -1, &error));
345 dbus_message_unref(message);
349 logError( "CAmNodeStateCommunicator::nsmUnRegisterShutdownClient failed, dbus error", error.message);
350 return (NsmErrorStatus_Dbus);
353 if(!dbus_message_get_args(reply, &error, DBUS_TYPE_INT32, &returnError, DBUS_TYPE_INVALID))
355 logError( "CAmNodeStateCommunicator::nsmUnRegisterShutdownClient failed, dbus error", error.message);
356 return (NsmErrorStatus_Dbus);
358 dbus_message_unref(reply);
360 return (static_cast<NsmErrorStatus_e>(returnError));
363 /** returns the interface version
366 * @return E_OK on success
368 am_Error_e CAmNodeStateCommunicator::nsmGetInterfaceVersion(uint32_t& version)
371 dbus_error_init(&error);
373 DBusMessage * message = dbus_message_new_method_call(NSM_BUS_INTERFACE, NSM_PATH, NSM_INTERFACE, "GetInterfaceVersion");
377 logError("CAmNodeStateCommunicator::nsmGetInterfaceVersion dbus error:", error.message);
381 DBusMessage* reply(dbus_connection_send_with_reply_and_block(mpDBusConnection, message, -1, &error));
383 dbus_message_unref(message);
387 logError("CAmNodeStateCommunicator::nsmGetInterfaceVersion failed, dbus error", error.message);
391 if(!dbus_message_get_args(reply, &error, DBUS_TYPE_UINT32, &version, DBUS_TYPE_INVALID))
393 logError("CAmNodeStateCommunicator::nsmGetInterfaceVersion failed, dbus error", error.message);
397 dbus_message_unref(reply);
402 /** sends out the Lifecycle request complete message
406 * @return NsmErrorStatus_Ok on success
408 NsmErrorStatus_e CAmNodeStateCommunicator::nsmSendLifecycleRequestComplete(const uint32_t RequestId, const NsmErrorStatus_e status)
411 DBusMessageIter iter;
412 dbus_error_init(&error);
413 int32_t returnError(0);
414 DBusMessage * message = dbus_message_new_method_call(NSM_BUS_INTERFACE, NSM_PATH, NSM_INTERFACE, "LifecycleRequestComplete");
418 logError( "CAmNodeStateCommunicator::nsmSendLifecycleRequestComplete dbus error:", error.message);
419 return (NsmErrorStatus_Dbus);
421 dbus_message_iter_init_append(message, &iter);
423 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &RequestId))
425 logError( "CAmNodeStateCommunicator::nsmSendLifecycleRequestComplete no more memory");
426 return (NsmErrorStatus_Dbus);
429 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32,&status))
431 logError( "CAmNodeStateCommunicator::nsmSendLifecycleRequestComplete no more memory");
432 return (NsmErrorStatus_Dbus);
435 DBusMessage* reply(dbus_connection_send_with_reply_and_block(mpDBusConnection, message, -1, &error));
436 dbus_message_unref(message);
440 logError( "CAmNodeStateCommunicator::nsmSendLifecycleRequestComplete failed, dbus error", error.message);
441 return (NsmErrorStatus_Dbus);
444 if(!dbus_message_get_args(reply, &error,DBUS_TYPE_INT32, &returnError, DBUS_TYPE_INVALID))
446 logError( "CAmNodeStateCommunicator::nsmSendLifecycleRequestComplete failed, dbus error", error.message);
447 return (NsmErrorStatus_Dbus);
449 dbus_message_unref(reply);
451 return (static_cast<NsmErrorStatus_e>(returnError));
454 void CAmNodeStateCommunicator::registerControlSender(CAmControlSender* iControlSender)
456 assert(iControlSender);
457 mpControlSender=iControlSender;
460 DBusHandlerResult CAmNodeStateCommunicator::receiveCallback(DBusConnection* conn, DBusMessage* msg, void* user_data)
462 CAmNodeStateCommunicator* instance = static_cast<CAmNodeStateCommunicator*>(user_data);
464 return (instance->receiveCallbackDelegate(conn,msg));
467 DBusHandlerResult CAmNodeStateCommunicator::receiveCallbackDelegate(DBusConnection* conn, DBusMessage* msg)
469 if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
471 sendIntrospection(conn, msg);
472 return (DBUS_HANDLER_RESULT_HANDLED);
476 DBusMessage * returnMessage;
477 dbus_uint32_t Request(0),RequestId(0);
478 //no introspection - ok. So we are only interested in out LifecycleRequest message...
479 std::string method(dbus_message_get_member(msg));
480 if (method=="LifecycleRequest")
482 DBusMessageIter iter,replyIter;
483 if (!dbus_message_iter_init(msg, &iter))
485 logError("CAmNodeStateCommunicator::receiveCallbackDelegate DBus Message has no arguments!");
486 returnMessage = dbus_message_new_error(msg,DBUS_ERROR_INVALID_ARGS, "DBUS Message has no arguments!");
487 sendMessage(returnMessage,msg);
488 return (DBUS_HANDLER_RESULT_HANDLED);
491 if (dbus_message_iter_get_arg_type(&iter)!=DBUS_TYPE_UINT32)
493 logError("CAmNodeStateCommunicator::receiveCallbackDelegate DBus Message has invalid arguments!");
494 returnMessage = dbus_message_new_error(msg,DBUS_ERROR_INVALID_ARGS,"DBus argument is not uint32_t!");
495 sendMessage(returnMessage,msg);
496 return (DBUS_HANDLER_RESULT_HANDLED);
499 dbus_message_iter_get_basic(&iter, &Request);
500 dbus_message_iter_next(&iter);
502 if (dbus_message_iter_get_arg_type(&iter)!=DBUS_TYPE_UINT32)
504 logError("CAmNodeStateCommunicator::receiveCallbackDelegate DBus Message has invalid arguments!");
505 returnMessage = dbus_message_new_error(msg,DBUS_ERROR_INVALID_ARGS,"DBus argument is not uint32_t!");
506 sendMessage(returnMessage,msg);
507 return (DBUS_HANDLER_RESULT_HANDLED);
510 dbus_message_iter_get_basic(&iter, &RequestId);
512 assert(mpControlSender);
513 NsmErrorStatus_e returnError = mpControlSender->hookSystemLifecycleRequest(static_cast<uint32_t>(Request),static_cast<uint32_t>(RequestId));
515 returnMessage = dbus_message_new_method_return(msg);
517 if (returnMessage == NULL)
519 logError("CAmNodeStateCommunicator::receiveCallbackDelegate Cannot allocate DBus message!");
520 returnMessage = dbus_message_new_error(msg,DBUS_ERROR_NO_MEMORY,"Cannot create reply!");
521 sendMessage(returnMessage,msg);
522 return (DBUS_HANDLER_RESULT_HANDLED);
525 dbus_message_iter_init_append(returnMessage, &replyIter);
527 if (!dbus_message_iter_append_basic(&replyIter, DBUS_TYPE_INT32, &returnError))
529 logError("CAmNodeStateCommunicator::receiveCallbackDelegate Cannot allocate DBus message!");
530 returnMessage = dbus_message_new_error(msg,DBUS_ERROR_NO_MEMORY,"Cannot create reply!");
532 sendMessage(returnMessage,msg);
533 return (DBUS_HANDLER_RESULT_HANDLED);
536 return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
539 void CAmNodeStateCommunicator::sendIntrospection(DBusConnection* conn, DBusMessage* msg)
541 assert(conn != NULL);
544 DBusMessageIter args;
545 dbus_uint32_t serial = 0;
547 // create a reply from the message
548 reply = dbus_message_new_method_return(msg);
549 std::string fullpath(NSM_INTROSPECTION_FILE);
550 std::ifstream in(fullpath.c_str(), std::ifstream::in);
553 logError("IAmCommandReceiverShadow::sendIntrospection could not load xml file ",fullpath);
554 throw std::runtime_error("IAmCommandReceiverShadow::sendIntrospection Could not load introspecton XML");
556 std::stringstream buffer;
557 buffer << in.rdbuf();
558 std::string introspect = buffer.str();
559 const char* string = introspect.c_str();
561 // add the arguments to the reply
562 dbus_message_iter_init_append(reply, &args);
563 if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &string))
565 logError( "CAmNodeStateCommunicator::sendIntrospection DBUS handler Out Of Memory!");
568 // send the reply && flush the connection
569 if (!dbus_connection_send(conn, reply, &serial))
571 logError( "CAmNodeStateCommunicator::sendIntrospection DBUS handler Out Of Memory!");
573 dbus_connection_flush(conn);
576 dbus_message_unref(reply);
579 void CAmNodeStateCommunicator::sendMessage(DBusMessage* message, DBusMessage* origMessage)
581 dbus_uint32_t serial = dbus_message_get_serial(origMessage);
583 if(!dbus_connection_send(mpDBusConnection, message, &serial))
585 logError( "CAmNodeStateCommunicator::sendMessage DBUS handler Out Of Memory!");
587 dbus_connection_flush(mpDBusConnection);
588 dbus_message_unref(message);
591 DBusHandlerResult CAmNodeStateCommunicator::signalCallback(DBusConnection* conn, DBusMessage* msg, void* user_data)
594 CAmNodeStateCommunicator* instance(static_cast<CAmNodeStateCommunicator*>(user_data));
596 const char* iface = dbus_message_get_interface(msg);
598 return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
599 std::string interface(iface);
600 std::string member = dbus_message_get_member(msg);
602 if (interface=="org.genivi.NodeStateManager.Consumer")
604 if (member=="NodeState")
607 DBusMessageIter iter;
608 if (!dbus_message_iter_init(msg, &iter))
610 logError("CAmNodeStateCommunicator::signalCallback NodeState DBus Message has no arguments!");
611 return (DBUS_HANDLER_RESULT_HANDLED);
614 if (dbus_message_iter_get_arg_type(&iter)!=DBUS_TYPE_INT32)
616 logError("CAmNodeStateCommunicator::signalCallback NodeState DBus Message has invalid arguments!");
617 return (DBUS_HANDLER_RESULT_HANDLED);
620 dbus_message_iter_get_basic(&iter, &nodeState);
622 logInfo("CAmNodeStateCommunicator::signalCallback got signal NodeState, with nodeState",nodeState);
624 assert(instance->mpControlSender);
625 instance->mpControlSender->hookSystemNodeStateChanged(static_cast<NsmNodeState_e>(nodeState));
626 return (DBUS_HANDLER_RESULT_HANDLED);
629 else if (member=="NodeApplicationMode")
631 int32_t nodeApplicationMode;
632 DBusMessageIter iter;
633 if (!dbus_message_iter_init(msg, &iter))
635 logError("CAmNodeStateCommunicator::signalCallback nodeApplicationMode DBus Message has no arguments!");
636 return (DBUS_HANDLER_RESULT_HANDLED);
639 if (dbus_message_iter_get_arg_type(&iter)!=DBUS_TYPE_INT32)
641 logError("CAmNodeStateCommunicator::signalCallback nodeApplicationMode DBus Message has invalid arguments!");
642 return (DBUS_HANDLER_RESULT_HANDLED);
645 dbus_message_iter_get_basic(&iter, &nodeApplicationMode);
647 logInfo("CAmNodeStateCommunicator::signalCallback got signal nodeApplicationMode, with applicationMode",nodeApplicationMode);
649 assert(instance->mpControlSender);
650 instance->mpControlSender->hookSystemNodeApplicationModeChanged(static_cast<NsmApplicationMode_e>(nodeApplicationMode));
651 return (DBUS_HANDLER_RESULT_HANDLED);
654 else if (member=="SessionStateChanged")
656 std::string sessionName;
658 NsmSessionState_e sessionState;
659 DBusMessageIter iter;
660 if (!dbus_message_iter_init(msg, &iter))
662 logError("CAmNodeStateCommunicator::signalCallback nodeApplicationMode DBus Message has no arguments!");
663 return (DBUS_HANDLER_RESULT_HANDLED);
666 if (dbus_message_iter_get_arg_type(&iter)!=DBUS_TYPE_STRING)
668 logError("CAmNodeStateCommunicator::signalCallback nodeApplicationMode DBus Message has invalid arguments!");
669 return (DBUS_HANDLER_RESULT_HANDLED);
672 char * sessionNameChar;
673 dbus_message_iter_get_basic(&iter, &sessionNameChar);
674 sessionName=std::string(sessionNameChar);
675 dbus_message_iter_next(&iter);
677 if (dbus_message_iter_get_arg_type(&iter)!=DBUS_TYPE_INT32)
679 logError("CAmNodeStateCommunicator::signalCallback nodeApplicationMode DBus Message has invalid arguments!");
680 return (DBUS_HANDLER_RESULT_HANDLED);
683 dbus_message_iter_get_basic(&iter, &seatID);
684 dbus_message_iter_next(&iter);
686 if (dbus_message_iter_get_arg_type(&iter)!=DBUS_TYPE_INT32)
688 logError("CAmNodeStateCommunicator::signalCallback nodeApplicationMode DBus Message has invalid arguments!");
689 return (DBUS_HANDLER_RESULT_HANDLED);
692 dbus_message_iter_get_basic(&iter, &sessionState);
695 logInfo("CAmNodeStateCommunicator::signalCallback got signal sessionStateChanged, with session",sessionName,"seatID=",seatID,"sessionState",sessionState);
697 assert(instance->mpControlSender);
698 instance->mpControlSender->hookSystemSessionStateChanged(sessionName,seatID,sessionState);
699 return (DBUS_HANDLER_RESULT_HANDLED);
704 return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
708 return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
711 am_Error_e CAmNodeStateCommunicator::readIntegerProperty(const std::string property, int32_t& value)
714 dbus_error_init(&error);
715 DBusMessageIter iter,iterVariant;
717 DBusMessage * message = dbus_message_new_method_call(NSM_BUS_INTERFACE, NSM_PATH, "org.freedesktop.DBus.Properties", "Get");
721 logError("CAmNodeStateCommunicator::readIntegerProperty dbus error:", error.message);
722 dbus_message_unref(message);
727 dbus_message_iter_init_append(message, &iter);
728 const char *interface=NSM_INTERFACE;
729 const char *propertyChar=property.c_str();
730 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &interface))
732 logError("CAmNodeStateCommunicator::readIntegerProperty append error");
733 dbus_message_unref(message);
737 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &propertyChar))
739 logError("CAmNodeStateCommunicator::readIntegerProperty append error");
740 dbus_message_unref(message);
744 DBusMessage* reply(dbus_connection_send_with_reply_and_block(mpDBusConnection, message, -1, &error));
747 logError("CAmNodeStateCommunicator::readIntegerProperty failed, dbus error", error.message);
748 dbus_message_unref(message);
752 if(!dbus_message_iter_init(reply,&iterVariant))
754 logError("CAmNodeStateCommunicator::readIntegerProperty failed, dbus error", error.message);
755 dbus_message_unref(message);
756 dbus_message_unref(reply);
759 if (dbus_message_iter_get_arg_type (&iterVariant)!= DBUS_TYPE_VARIANT)
761 logError("CAmNodeStateCommunicator::readIntegerProperty failed, dbus return type wrong");
762 dbus_message_unref(reply);
763 dbus_message_unref(message);
766 DBusMessageIter subiter;
767 dbus_message_iter_recurse (&iterVariant, &subiter);
768 if (dbus_message_iter_get_arg_type (&subiter)!= DBUS_TYPE_INT32)
770 logError("CAmNodeStateCommunicator::readIntegerProperty failed, dbus return type wrong");
771 dbus_message_unref(reply);
772 dbus_message_unref(message);
776 dbus_message_iter_get_basic(&subiter,&value);
777 dbus_message_unref(reply);
778 dbus_message_unref(message);