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"
32 #include "DLTWrapper.h"
36 DLT_IMPORT_CONTEXT(commandDbus)
39 * static ObjectPathTable is needed for DBus Callback handling
41 static DBusObjectPathVTable gObjectPathVTable;
43 CommandReceiverShadow::CommandReceiverShadow() :
44 mCommandReceiveInterface(NULL), //
45 mDBusWrapper(NULL), //
46 mFunctionMap(createMap()), //
49 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow constructed");
52 CommandReceiverShadow::~CommandReceiverShadow()
54 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow destructed");
57 void CommandReceiverShadow::connect(DBusConnection *conn, DBusMessage *msg)
59 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::connect called");
62 assert(mCommandReceiveInterface!=NULL);
64 mDBUSMessageHandler.initReceive(msg);
65 am_sourceID_t sourceID = (am_sourceID_t) mDBUSMessageHandler.getUInt();
66 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
67 am_mainConnectionID_t mainConnectionID = 0;
68 am_Error_e returnCode = mCommandReceiveInterface->connect(sourceID, sinkID, mainConnectionID);
69 mDBUSMessageHandler.initReply(msg);
70 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
71 mDBUSMessageHandler.append((dbus_uint16_t) mainConnectionID);
72 mDBUSMessageHandler.sendMessage();
75 void CommandReceiverShadow::disconnect(DBusConnection *conn, DBusMessage *msg)
77 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::disconnect called");
80 assert(mCommandReceiveInterface!=NULL);
82 mDBUSMessageHandler.initReceive(msg);
83 am_mainConnectionID_t mainConnnectionID = (am_mainConnectionID_t) mDBUSMessageHandler.getUInt();
84 am_Error_e returnCode = mCommandReceiveInterface->disconnect(mainConnnectionID);
85 mDBUSMessageHandler.initReply(msg);
86 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
87 mDBUSMessageHandler.sendMessage();
90 void CommandReceiverShadow::setVolume(DBusConnection *conn, DBusMessage *msg)
92 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::setVolume called");
95 assert(mCommandReceiveInterface!=NULL);
97 mDBUSMessageHandler.initReceive(msg);
98 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
99 am_volume_t volume = (am_volume_t) mDBUSMessageHandler.getInt();
100 am_Error_e returnCode = mCommandReceiveInterface->setVolume(sinkID, volume);
101 mDBUSMessageHandler.initReply(msg);
102 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
103 mDBUSMessageHandler.sendMessage();
106 void CommandReceiverShadow::volumeStep(DBusConnection *conn, DBusMessage *msg)
108 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::volumeStep called");
111 assert(mCommandReceiveInterface!=NULL);
113 mDBUSMessageHandler.initReceive(msg);
114 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
115 int16_t volumeStep = (int16_t) mDBUSMessageHandler.getInt();
116 am_Error_e returnCode = mCommandReceiveInterface->volumeStep(sinkID, volumeStep);
117 mDBUSMessageHandler.initReply(msg);
118 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
119 mDBUSMessageHandler.sendMessage();
122 void CommandReceiverShadow::setSinkMuteState(DBusConnection *conn, DBusMessage *msg)
124 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::setSinkMuteState called");
127 assert(mCommandReceiveInterface!=NULL);
129 mDBUSMessageHandler.initReceive(msg);
130 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
131 am_MuteState_e muteState = (am_MuteState_e) mDBUSMessageHandler.getInt();
132 am_Error_e returnCode = mCommandReceiveInterface->setSinkMuteState(sinkID, muteState);
133 mDBUSMessageHandler.initReply(msg);
134 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
135 mDBUSMessageHandler.sendMessage();
138 void CommandReceiverShadow::setMainSinkSoundProperty(DBusConnection *conn, DBusMessage *msg)
140 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::setMainSinkSoundProperty called");
143 assert(mCommandReceiveInterface!=NULL);
145 mDBUSMessageHandler.initReceive(msg);
146 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
147 dbus_int16_t type = 0;
148 dbus_int16_t value = 0;
149 mDBUSMessageHandler.getProperty(type, value);
150 am_MainSoundProperty_s mainSoundProperty;
151 mainSoundProperty.type = (am_MainSoundPropertyType_e) type;
152 mainSoundProperty.value = (int32_t) value;
153 am_Error_e returnCode = mCommandReceiveInterface->setMainSinkSoundProperty(mainSoundProperty, sinkID);
154 mDBUSMessageHandler.initReply(msg);
155 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
156 mDBUSMessageHandler.sendMessage();
159 void CommandReceiverShadow::setMainSourceSoundProperty(DBusConnection *conn, DBusMessage *msg)
161 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::setMainSourceSoundProperty called");
164 assert(mCommandReceiveInterface!=NULL);
166 mDBUSMessageHandler.initReceive(msg);
167 am_sourceID_t sourceID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
168 dbus_int16_t type = 0;
169 dbus_int16_t value = 0;
170 mDBUSMessageHandler.getProperty(type, value);
171 am_MainSoundProperty_s mainSoundProperty;
172 mainSoundProperty.type = (am_MainSoundPropertyType_e) type;
173 mainSoundProperty.value = (int32_t) value;
174 am_Error_e returnCode = mCommandReceiveInterface->setMainSourceSoundProperty(mainSoundProperty, sourceID);
175 mDBUSMessageHandler.initReply(msg);
176 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
177 mDBUSMessageHandler.sendMessage();
180 void CommandReceiverShadow::setSystemProperty(DBusConnection *conn, DBusMessage *msg)
182 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::setSystemProperty called");
185 assert(mCommandReceiveInterface!=NULL);
187 mDBUSMessageHandler.initReceive(msg);
188 dbus_int16_t type = 0;
189 dbus_int16_t value = 0;
190 mDBUSMessageHandler.getProperty(type, value);
191 am_SystemProperty_s systemProperty;
192 systemProperty.type = (am_SystemPropertyType_e) type;
193 systemProperty.value = (int32_t) value;
194 am_Error_e returnCode = mCommandReceiveInterface->setSystemProperty(systemProperty);
195 mDBUSMessageHandler.initReply(msg);
196 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
197 mDBUSMessageHandler.sendMessage();
200 void CommandReceiverShadow::getListMainConnections(DBusConnection *conn, DBusMessage *msg)
202 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::getListMainConnections called");
205 assert(mCommandReceiveInterface!=NULL);
206 std::vector<am_MainConnectionType_s> listMainConnections;
207 am_Error_e returnCode = mCommandReceiveInterface->getListMainConnections(listMainConnections);
208 mDBUSMessageHandler.initReply(msg);
209 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
210 mDBUSMessageHandler.append(listMainConnections);
211 mDBUSMessageHandler.sendMessage();
214 void CommandReceiverShadow::getListMainSinks(DBusConnection *conn, DBusMessage *msg)
216 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::getListMainSinks called");
219 assert(mCommandReceiveInterface!=NULL);
220 std::vector<am_SinkType_s> listSinks;
221 am_Error_e returnCode = mCommandReceiveInterface->getListMainSinks(listSinks);
222 mDBUSMessageHandler.initReply(msg);
223 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
224 mDBUSMessageHandler.append(listSinks);
225 mDBUSMessageHandler.sendMessage();
228 void CommandReceiverShadow::getListMainSources(DBusConnection *conn, DBusMessage *msg)
230 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::getListMainSources called");
233 assert(mCommandReceiveInterface!=NULL);
234 std::vector<am_SourceType_s> listSources;
235 am_Error_e returnCode = mCommandReceiveInterface->getListMainSources(listSources);
236 mDBUSMessageHandler.initReply(msg);
237 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
238 mDBUSMessageHandler.append(listSources);
239 mDBUSMessageHandler.sendMessage();
242 void CommandReceiverShadow::getListMainSinkSoundProperties(DBusConnection *conn, DBusMessage *msg)
244 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::getListMainSinkSoundProperties called");
247 assert(mCommandReceiveInterface!=NULL);
249 mDBUSMessageHandler.initReceive(msg);
250 am_sinkID_t sinkID = (am_sinkID_t) mDBUSMessageHandler.getUInt();
251 std::vector<am_MainSoundProperty_s> listSinkSoundProperties;
252 am_Error_e returnCode = mCommandReceiveInterface->getListMainSinkSoundProperties(sinkID, listSinkSoundProperties);
253 mDBUSMessageHandler.initReply(msg);
254 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
255 mDBUSMessageHandler.append(listSinkSoundProperties);
256 mDBUSMessageHandler.sendMessage();
259 void CommandReceiverShadow::getListMainSourceSoundProperties(DBusConnection *conn, DBusMessage *msg)
261 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::getListMainSourceSoundProperties called");
264 assert(mCommandReceiveInterface!=NULL);
266 mDBUSMessageHandler.initReceive(msg);
267 am_sourceID_t sourceID = (am_sourceID_t) mDBUSMessageHandler.getUInt();
268 std::vector<am_MainSoundProperty_s> listSinkSoundProperties;
269 am_Error_e returnCode = mCommandReceiveInterface->getListMainSourceSoundProperties(sourceID, listSinkSoundProperties);
270 mDBUSMessageHandler.initReply(msg);
271 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
272 mDBUSMessageHandler.append(listSinkSoundProperties);
273 mDBUSMessageHandler.sendMessage();
276 void CommandReceiverShadow::getListSourceClasses(DBusConnection *conn, DBusMessage *msg)
278 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::getListSourceClasses called");
281 assert(mCommandReceiveInterface!=NULL);
282 std::vector<am_SourceClass_s> listSourceClasses;
283 am_Error_e returnCode = mCommandReceiveInterface->getListSourceClasses(listSourceClasses);
284 mDBUSMessageHandler.initReply(msg);
285 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
286 mDBUSMessageHandler.append(listSourceClasses);
287 mDBUSMessageHandler.sendMessage();
290 void CommandReceiverShadow::getListSinkClasses(DBusConnection *conn, DBusMessage *msg)
292 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::getListSinkClasses called");
295 assert(mCommandReceiveInterface!=NULL);
296 std::vector<am_SinkClass_s> listSinkClasses;
297 am_Error_e returnCode = mCommandReceiveInterface->getListSinkClasses(listSinkClasses);
298 mDBUSMessageHandler.initReply(msg);
299 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
300 mDBUSMessageHandler.append(listSinkClasses);
301 mDBUSMessageHandler.sendMessage();
304 void CommandReceiverShadow::getListSystemProperties(DBusConnection *conn, DBusMessage *msg)
306 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::getListSystemProperties called");
309 assert(mCommandReceiveInterface!=NULL);
310 std::vector<am_SystemProperty_s> listSystemProperties;
311 am_Error_e returnCode = mCommandReceiveInterface->getListSystemProperties(listSystemProperties);
312 mDBUSMessageHandler.initReply(msg);
313 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
314 mDBUSMessageHandler.append(listSystemProperties);
315 mDBUSMessageHandler.sendMessage();
318 void CommandReceiverShadow::getTimingInformation(DBusConnection *conn, DBusMessage *msg)
320 log(&commandDbus,DLT_LOG_INFO,"CommandReceiverShadow::getTimingInformation called");
323 assert(mCommandReceiveInterface!=NULL);
325 mDBUSMessageHandler.initReceive(msg);
326 am_mainConnectionID_t mainConnectionID = (am_mainConnectionID_t) mDBUSMessageHandler.getUInt();
327 am_timeSync_t delay = 0;
328 am_Error_e returnCode = mCommandReceiveInterface->getTimingInformation(mainConnectionID, delay);
329 mDBUSMessageHandler.initReply(msg);
330 mDBUSMessageHandler.append((dbus_int16_t) returnCode);
331 mDBUSMessageHandler.append((dbus_int16_t) delay);
332 mDBUSMessageHandler.sendMessage();
335 DBusHandlerResult CommandReceiverShadow::receiveCallback(DBusConnection *conn, DBusMessage *msg, void *user_data)
339 assert(user_data!=NULL);
340 CommandReceiverShadow* reference = (CommandReceiverShadow*) user_data;
341 return (reference->receiveCallbackDelegate(conn, msg));
344 void CommandReceiverShadow::sendIntrospection(DBusConnection *conn, DBusMessage *msg)
349 DBusMessageIter args;
350 dbus_uint32_t serial = 0;
352 // create a reply from the message
353 reply = dbus_message_new_method_return(msg);
354 std::ifstream in(INTROSPECTION_COMMAND_XML_FILE);
356 std::string introspect((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
357 const char* string = introspect.c_str();
359 // add the arguments to the reply
360 dbus_message_iter_init_append(reply, &args);
361 if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &string))
363 // DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
366 // send the reply && flush the connection
367 if (!dbus_connection_send(conn, reply, &serial))
369 // DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
371 dbus_connection_flush(conn);
374 dbus_message_unref(reply);
377 DBusHandlerResult CommandReceiverShadow::receiveCallbackDelegate(DBusConnection *conn, DBusMessage *msg)
379 //DLT_LOG(dMain, DLT_LOG_INFO, DLT_STRING("message received"));
381 if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
383 sendIntrospection(conn, msg);
384 return (DBUS_HANDLER_RESULT_HANDLED);
387 functionMap_t::iterator iter = mFunctionMap.begin();
388 std::string k(dbus_message_get_member(msg));
389 iter = mFunctionMap.find(k);
390 if (iter != mFunctionMap.end())
392 std::string p(iter->first);
393 CallBackMethod cb = iter->second;
394 (this->*cb)(conn, msg);
395 return (DBUS_HANDLER_RESULT_HANDLED);
398 return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
401 void CommandReceiverShadow::setCommandReceiver(CommandReceiveInterface*& receiver)
403 assert(receiver!=NULL);
404 mCommandReceiveInterface = receiver;
406 gObjectPathVTable.message_function = CommandReceiverShadow::receiveCallback;
408 DBusConnection* connection;
409 mCommandReceiveInterface->getDBusConnectionWrapper(mDBusWrapper);
410 assert(mDBusWrapper!=NULL);
412 mDBusWrapper->getDBusConnection(connection);
413 assert(connection!=NULL);
414 mDBUSMessageHandler.setDBusConnection(connection);
416 std::string path(MY_NODE);
417 mDBusWrapper->registerCallback(&gObjectPathVTable, path, this);
420 CommandReceiverShadow::functionMap_t CommandReceiverShadow::createMap()
423 m["Connect"] = &CommandReceiverShadow::connect;
424 m["Disconnect"] = &CommandReceiverShadow::disconnect;
425 m["SetVolume"] = &CommandReceiverShadow::setVolume;
426 m["VolumeStep"] = &CommandReceiverShadow::volumeStep;
427 m["SetSinkMuteState"] = &CommandReceiverShadow::setSinkMuteState;
428 m["SetMainSinkSoundProperty"] = &CommandReceiverShadow::setMainSinkSoundProperty;
429 m["SetMainSourceSoundProperty"] = &CommandReceiverShadow::setMainSourceSoundProperty;
430 m["GetListMainConnections"] = &CommandReceiverShadow::getListMainConnections;
431 m["GetListMainSinks"] = &CommandReceiverShadow::getListMainSinks;
432 m["GetListMainSources"] = &CommandReceiverShadow::getListMainSources;
433 m["GetListMainSinkSoundProperties"] = &CommandReceiverShadow::getListMainSinkSoundProperties;
434 m["GetListMainSourceSoundProperties"] = &CommandReceiverShadow::getListMainSourceSoundProperties;
435 m["GetListSourceClasses"] = &CommandReceiverShadow::getListSourceClasses;
436 m["GetListSinkClasses"] = &CommandReceiverShadow::getListSinkClasses;
437 m["GetListSystemProperties"] = &CommandReceiverShadow::getListSystemProperties;
438 m["GetTimingInformation"] = &CommandReceiverShadow::getTimingInformation;
439 m["SetSystemProperty"] = &CommandReceiverShadow::setSystemProperty;