2 * Copyright (C) 2011, BMW AG
4 * GeniviAudioMananger DbusPlugin
6 * \file CommandReceiverShadow.cpp
8 * \date 20-Oct-2011 3:42:04 PM
9 * \author Christian Mueller (christian.ei.mueller@bmw.de)
12 * GNU Lesser General Public License, version 2.1, with special exception (GENIVI clause)
13 * Copyright (C) 2011, BMW AG Christian Mueller Christian.ei.mueller@bmw.de
15 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License, version 2.1, as published by the Free Software Foundation.
16 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License, version 2.1, for more details.
17 * You should have received a copy of the GNU Lesser General Public License, version 2.1, along with this program; if not, see <http://www.gnu.org/licenses/lgpl-2.1.html>.
18 * Note that the copyright holders assume that the GNU Lesser General Public License, version 2.1, may also be applicable to programs even in cases in which the program is not a library in the technical sense.
19 * Linking AudioManager statically or dynamically with other modules is making a combined work based on AudioManager. You may license such other modules under the GNU Lesser General Public License, version 2.1. If you do not want to license your linked modules under the GNU Lesser General Public License, version 2.1, you may use the program under the following exception.
20 * As a special exception, the copyright holders of AudioManager give you permission to combine AudioManager with software programs or libraries that are released under any license unless such a combination is not permitted by the license of such a software program or library. You may copy and distribute such a system following the terms of the GNU Lesser General Public License, version 2.1, including this special exception, for AudioManager and the licenses of the other code concerned.
21 * Note that people who make modified versions of AudioManager are not obligated to grant this special exception for their modified versions; it is their choice whether to do so. The GNU Lesser General Public License, version 2.1, gives permission to release a modified version without this exception; this exception also makes it possible to release a modified version which carries forward this exception.
23 * THIS CODE HAS BEEN GENERATED BY ENTERPRISE ARCHITECT GENIVI MODEL. PLEASE CHANGE ONLY IN ENTERPRISE ARCHITECT AND GENERATE AGAIN
26 #include <audiomanagertypes.h>
30 #include "CommandReceiverShadow.h"
31 #include "DBusCommandSender.h"
35 DLT_IMPORT_CONTEXT(DLT_CONTEXT)
38 * static ObjectPathTable is needed for DBus Callback handling
40 static DBusObjectPathVTable gObjectPathVTable;
42 CommandReceiverShadow::CommandReceiverShadow() :
43 mCommandReceiveInterface(NULL), //
44 mDBusWrapper(NULL), //
45 mFunctionMap(createMap()), //
48 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow constructed"));
51 CommandReceiverShadow::~CommandReceiverShadow()
53 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow destructed"));
56 void CommandReceiverShadow::connect(DBusConnection *conn, DBusMessage *msg)
58 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::connect called"));
61 assert(mCommandReceiveInterface!=NULL);
63 mDBUSMessageHandler.initReceive(msg);
64 am_sourceID_t sourceID = (am_sourceID_t) mDBUSMessageHandler.getUInt();
65 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
66 am_mainConnectionID_t mainConnectionID = 0;
67 am_Error_e returnCode = mCommandReceiveInterface->connect(sourceID, sinkID, mainConnectionID);
68 mDBUSMessageHandler.initReply(msg);
69 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
70 mDBUSMessageHandler.append((dbus_uint16_t) mainConnectionID);
71 mDBUSMessageHandler.sendMessage();
74 void CommandReceiverShadow::disconnect(DBusConnection *conn, DBusMessage *msg)
76 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::disconnect called"));
79 assert(mCommandReceiveInterface!=NULL);
81 mDBUSMessageHandler.initReceive(msg);
82 am_mainConnectionID_t mainConnnectionID = (am_mainConnectionID_t) mDBUSMessageHandler.getUInt();
83 am_Error_e returnCode = mCommandReceiveInterface->disconnect(mainConnnectionID);
84 mDBUSMessageHandler.initReply(msg);
85 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
86 mDBUSMessageHandler.sendMessage();
89 void CommandReceiverShadow::setVolume(DBusConnection *conn, DBusMessage *msg)
91 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::setVolume called"));
94 assert(mCommandReceiveInterface!=NULL);
96 mDBUSMessageHandler.initReceive(msg);
97 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
98 am_volume_t volume = (am_volume_t) mDBUSMessageHandler.getInt();
99 am_Error_e returnCode = mCommandReceiveInterface->setVolume(sinkID, volume);
100 mDBUSMessageHandler.initReply(msg);
101 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
102 mDBUSMessageHandler.sendMessage();
105 void CommandReceiverShadow::volumeStep(DBusConnection *conn, DBusMessage *msg)
107 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::volumeStep called"));
110 assert(mCommandReceiveInterface!=NULL);
112 mDBUSMessageHandler.initReceive(msg);
113 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
114 int16_t volumeStep = (int16_t) mDBUSMessageHandler.getInt();
115 am_Error_e returnCode = mCommandReceiveInterface->volumeStep(sinkID, volumeStep);
116 mDBUSMessageHandler.initReply(msg);
117 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
118 mDBUSMessageHandler.sendMessage();
121 void CommandReceiverShadow::setSinkMuteState(DBusConnection *conn, DBusMessage *msg)
123 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::setSinkMuteState called"));
126 assert(mCommandReceiveInterface!=NULL);
128 mDBUSMessageHandler.initReceive(msg);
129 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
130 am_MuteState_e muteState = (am_MuteState_e) mDBUSMessageHandler.getInt();
131 am_Error_e returnCode = mCommandReceiveInterface->setSinkMuteState(sinkID, muteState);
132 mDBUSMessageHandler.initReply(msg);
133 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
134 mDBUSMessageHandler.sendMessage();
137 void CommandReceiverShadow::setMainSinkSoundProperty(DBusConnection *conn, DBusMessage *msg)
139 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::setMainSinkSoundProperty called"));
142 assert(mCommandReceiveInterface!=NULL);
144 mDBUSMessageHandler.initReceive(msg);
145 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
146 dbus_int16_t type = 0;
147 dbus_int16_t value = 0;
148 mDBUSMessageHandler.getProperty(type, value);
149 am_MainSoundProperty_s mainSoundProperty;
150 mainSoundProperty.type = (am_MainSoundPropertyType_e) type;
151 mainSoundProperty.value = (int32_t) value;
152 am_Error_e returnCode = mCommandReceiveInterface->setMainSinkSoundProperty(mainSoundProperty, sinkID);
153 mDBUSMessageHandler.initReply(msg);
154 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
155 mDBUSMessageHandler.sendMessage();
158 void CommandReceiverShadow::setMainSourceSoundProperty(DBusConnection *conn, DBusMessage *msg)
160 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::setMainSourceSoundProperty called"));
163 assert(mCommandReceiveInterface!=NULL);
165 mDBUSMessageHandler.initReceive(msg);
166 am_sourceID_t sourceID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
167 dbus_int16_t type = 0;
168 dbus_int16_t value = 0;
169 mDBUSMessageHandler.getProperty(type, value);
170 am_MainSoundProperty_s mainSoundProperty;
171 mainSoundProperty.type = (am_MainSoundPropertyType_e) type;
172 mainSoundProperty.value = (int32_t) value;
173 am_Error_e returnCode = mCommandReceiveInterface->setMainSourceSoundProperty(mainSoundProperty, sourceID);
174 mDBUSMessageHandler.initReply(msg);
175 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
176 mDBUSMessageHandler.sendMessage();
179 void CommandReceiverShadow::setSystemProperty(DBusConnection *conn, DBusMessage *msg)
181 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::setSystemProperty called"));
184 assert(mCommandReceiveInterface!=NULL);
186 mDBUSMessageHandler.initReceive(msg);
187 dbus_int16_t type = 0;
188 dbus_int16_t value = 0;
189 mDBUSMessageHandler.getProperty(type, value);
190 am_SystemProperty_s systemProperty;
191 systemProperty.type = (am_SystemPropertyType_e) type;
192 systemProperty.value = (int32_t) value;
193 am_Error_e returnCode = mCommandReceiveInterface->setSystemProperty(systemProperty);
194 mDBUSMessageHandler.initReply(msg);
195 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
196 mDBUSMessageHandler.sendMessage();
199 void CommandReceiverShadow::getListMainConnections(DBusConnection *conn, DBusMessage *msg)
201 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::getListMainConnections called"));
204 assert(mCommandReceiveInterface!=NULL);
205 std::vector<am_MainConnectionType_s> listMainConnections;
206 am_Error_e returnCode = mCommandReceiveInterface->getListMainConnections(listMainConnections);
207 mDBUSMessageHandler.initReply(msg);
208 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
209 mDBUSMessageHandler.append(listMainConnections);
210 mDBUSMessageHandler.sendMessage();
213 void CommandReceiverShadow::getListMainSinks(DBusConnection *conn, DBusMessage *msg)
215 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::getListMainSinks called"));
218 assert(mCommandReceiveInterface!=NULL);
219 std::vector<am_SinkType_s> listSinks;
220 am_Error_e returnCode = mCommandReceiveInterface->getListMainSinks(listSinks);
221 mDBUSMessageHandler.initReply(msg);
222 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
223 mDBUSMessageHandler.append(listSinks);
224 mDBUSMessageHandler.sendMessage();
227 void CommandReceiverShadow::getListMainSources(DBusConnection *conn, DBusMessage *msg)
229 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::getListMainSources called"));
232 assert(mCommandReceiveInterface!=NULL);
233 std::vector<am_SourceType_s> listSources;
234 am_Error_e returnCode = mCommandReceiveInterface->getListMainSources(listSources);
235 mDBUSMessageHandler.initReply(msg);
236 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
237 mDBUSMessageHandler.append(listSources);
238 mDBUSMessageHandler.sendMessage();
241 void CommandReceiverShadow::getListMainSinkSoundProperties(DBusConnection *conn, DBusMessage *msg)
243 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::getListMainSinkSoundProperties called"));
246 assert(mCommandReceiveInterface!=NULL);
248 mDBUSMessageHandler.initReceive(msg);
249 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
250 std::vector<am_MainSoundProperty_s> listSinkSoundProperties;
251 am_Error_e returnCode = mCommandReceiveInterface->getListMainSinkSoundProperties(sinkID, listSinkSoundProperties);
252 mDBUSMessageHandler.initReply(msg);
253 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
254 mDBUSMessageHandler.append(listSinkSoundProperties);
255 mDBUSMessageHandler.sendMessage();
258 void CommandReceiverShadow::getListMainSourceSoundProperties(DBusConnection *conn, DBusMessage *msg)
260 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::getListMainSourceSoundProperties called"));
263 assert(mCommandReceiveInterface!=NULL);
265 mDBUSMessageHandler.initReceive(msg);
266 am_sourceID_t sourceID = (am_sourceID_t) mDBUSMessageHandler.getUInt();
267 std::vector<am_MainSoundProperty_s> listSinkSoundProperties;
268 am_Error_e returnCode = mCommandReceiveInterface->getListMainSourceSoundProperties(sourceID, listSinkSoundProperties);
269 mDBUSMessageHandler.initReply(msg);
270 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
271 mDBUSMessageHandler.append(listSinkSoundProperties);
272 mDBUSMessageHandler.sendMessage();
275 void CommandReceiverShadow::getListSourceClasses(DBusConnection *conn, DBusMessage *msg)
277 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::getListSourceClasses called"));
280 assert(mCommandReceiveInterface!=NULL);
281 std::vector<am_SourceClass_s> listSourceClasses;
282 am_Error_e returnCode = mCommandReceiveInterface->getListSourceClasses(listSourceClasses);
283 mDBUSMessageHandler.initReply(msg);
284 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
285 mDBUSMessageHandler.append(listSourceClasses);
286 mDBUSMessageHandler.sendMessage();
289 void CommandReceiverShadow::getListSinkClasses(DBusConnection *conn, DBusMessage *msg)
291 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::getListSinkClasses called"));
294 assert(mCommandReceiveInterface!=NULL);
295 std::vector<am_SinkClass_s> listSinkClasses;
296 am_Error_e returnCode = mCommandReceiveInterface->getListSinkClasses(listSinkClasses);
297 mDBUSMessageHandler.initReply(msg);
298 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
299 mDBUSMessageHandler.append(listSinkClasses);
300 mDBUSMessageHandler.sendMessage();
303 void CommandReceiverShadow::getListSystemProperties(DBusConnection *conn, DBusMessage *msg)
305 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::getListSystemProperties called"));
308 assert(mCommandReceiveInterface!=NULL);
309 std::vector<am_SystemProperty_s> listSystemProperties;
310 am_Error_e returnCode = mCommandReceiveInterface->getListSystemProperties(listSystemProperties);
311 mDBUSMessageHandler.initReply(msg);
312 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
313 mDBUSMessageHandler.append(listSystemProperties);
314 mDBUSMessageHandler.sendMessage();
317 void CommandReceiverShadow::getTimingInformation(DBusConnection *conn, DBusMessage *msg)
319 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("CommandReceiverShadow::getTimingInformation called"));
322 assert(mCommandReceiveInterface!=NULL);
324 mDBUSMessageHandler.initReceive(msg);
325 am_mainConnectionID_t mainConnectionID = (am_mainConnectionID_t) mDBUSMessageHandler.getUInt();
326 am_timeSync_t delay = 0;
327 am_Error_e returnCode = mCommandReceiveInterface->getTimingInformation(mainConnectionID, delay);
328 mDBUSMessageHandler.initReply(msg);
329 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
330 mDBUSMessageHandler.append((dbus_int16_t) delay);
331 mDBUSMessageHandler.sendMessage();
334 DBusHandlerResult CommandReceiverShadow::receiveCallback(DBusConnection *conn, DBusMessage *msg, void *user_data)
338 assert(user_data!=NULL);
339 CommandReceiverShadow* reference = (CommandReceiverShadow*) user_data;
340 return (reference->receiveCallbackDelegate(conn, msg));
343 void CommandReceiverShadow::sendIntrospection(DBusConnection *conn, DBusMessage *msg)
348 DBusMessageIter args;
349 dbus_uint32_t serial = 0;
351 // create a reply from the message
352 reply = dbus_message_new_method_return(msg);
353 std::ifstream in(INTROSPECTION_COMMAND_XML_FILE);
355 std::string introspect((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
356 const char* string = introspect.c_str();
358 // add the arguments to the reply
359 dbus_message_iter_init_append(reply, &args);
360 if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &string))
362 // DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
365 // send the reply && flush the connection
366 if (!dbus_connection_send(conn, reply, &serial))
368 // DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
370 dbus_connection_flush(conn);
373 dbus_message_unref(reply);
376 DBusHandlerResult CommandReceiverShadow::receiveCallbackDelegate(DBusConnection *conn, DBusMessage *msg)
378 //DLT_LOG(dMain, DLT_LOG_INFO, DLT_STRING("message received"));
380 if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
382 sendIntrospection(conn, msg);
383 return (DBUS_HANDLER_RESULT_HANDLED);
386 functionMap_t::iterator iter = mFunctionMap.begin();
387 std::string k(dbus_message_get_member(msg));
388 iter = mFunctionMap.find(k);
389 if (iter != mFunctionMap.end())
391 std::string p(iter->first);
392 CallBackMethod cb = iter->second;
393 (this->*cb)(conn, msg);
394 return (DBUS_HANDLER_RESULT_HANDLED);
397 return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
400 void CommandReceiverShadow::setCommandReceiver(CommandReceiveInterface*& receiver)
402 assert(receiver!=NULL);
403 mCommandReceiveInterface = receiver;
405 gObjectPathVTable.message_function = CommandReceiverShadow::receiveCallback;
407 DBusConnection* connection;
408 mCommandReceiveInterface->getDBusConnectionWrapper(mDBusWrapper);
409 assert(mDBusWrapper!=NULL);
411 mDBusWrapper->getDBusConnection(connection);
412 assert(connection!=NULL);
413 mDBUSMessageHandler.setDBusConnection(connection);
415 std::string path(MY_NODE);
416 mDBusWrapper->registerCallback(&gObjectPathVTable, path, this);
419 CommandReceiverShadow::functionMap_t CommandReceiverShadow::createMap()
422 m["Connect"] = &CommandReceiverShadow::connect;
423 m["Disconnect"] = &CommandReceiverShadow::disconnect;
424 m["SetVolume"] = &CommandReceiverShadow::setVolume;
425 m["VolumeStep"] = &CommandReceiverShadow::volumeStep;
426 m["SetSinkMuteState"] = &CommandReceiverShadow::setSinkMuteState;
427 m["SetMainSinkSoundProperty"] = &CommandReceiverShadow::setMainSinkSoundProperty;
428 m["SetMainSourceSoundProperty"] = &CommandReceiverShadow::setMainSourceSoundProperty;
429 m["GetListMainConnections"] = &CommandReceiverShadow::getListMainConnections;
430 m["GetListMainSinks"] = &CommandReceiverShadow::getListMainSinks;
431 m["GetListMainSources"] = &CommandReceiverShadow::getListMainSources;
432 m["GetListMainSinkSoundProperties"] = &CommandReceiverShadow::getListMainSinkSoundProperties;
433 m["GetListMainSourceSoundProperties"] = &CommandReceiverShadow::getListMainSourceSoundProperties;
434 m["GetListSourceClasses"] = &CommandReceiverShadow::getListSourceClasses;
435 m["GetListSinkClasses"] = &CommandReceiverShadow::getListSinkClasses;
436 m["GetListSystemProperties"] = &CommandReceiverShadow::getListSystemProperties;
437 m["GetTimingInformation"] = &CommandReceiverShadow::getTimingInformation;
438 m["SetSystemProperty"] = &CommandReceiverShadow::setSystemProperty;