1 /***************************************************************************
3 * Copyright 2010 BMW Car IT GmbH
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 ****************************************************************************/
19 #include <dbus/dbus.h>
27 #include "DBUSCommunicator.h"
30 #define CONNMAN_SERVICE "de.bmw.CompositingService"
31 #define CONNMAN_PATH "/de/bmw/CompositingService"
33 typedef void (DBUSCommunicator::*CallBackMethod) (DBusConnection *connection, DBusMessage *message);
37 const char *signature;
39 CallBackMethod function;
42 static MethodTable manager_methods[] = {
43 { "Debug", "b", "", &DBUSCommunicator::Debug },
44 { "ListAllLayerIDS", "", "au", &DBUSCommunicator::ListAllLayerIDS},
45 { "ListAllSurfaceIDS", "", "au", &DBUSCommunicator::ListAllSurfaceIDS},
46 { "ListAllLayerGroupIDS", "", "au", &DBUSCommunicator::ListAllLayerGroupIDS},
47 { "ListAllSurfaceGroupIDS", "", "au", &DBUSCommunicator::ListAllSurfaceGroupIDS},
48 { "ListSurfacesOfSurfacegroup", "u", "au", &DBUSCommunicator::ListSurfacesOfSurfacegroup},
49 { "ListLayersOfLayergroup", "u", "au", &DBUSCommunicator::ListLayersOfLayergroup},
50 { "ListSurfaceofLayer", "u", "au", &DBUSCommunicator::ListSurfaceofLayer},
51 { "getPropertiesOfSurface", "u", "duuuuuuuuyb", &DBUSCommunicator::getPropertiesOfSurface},
52 { "getPropertiesOfLayer", "u", "duuuuuuuuyb", &DBUSCommunicator::getPropertiesOfLayer },
53 { "CreateSurface", "uuuu", "u", &DBUSCommunicator::CreateSurface},
54 { "RemoveSurface", "u", "", &DBUSCommunicator::RemoveSurface },
55 { "CreateLayer", "", "u", &DBUSCommunicator::CreateLayer },
56 { "RemoveLayer", "u", "", &DBUSCommunicator::RemoveLayer },
57 { "AddSurfaceToSurfaceGroup", "uu", "", &DBUSCommunicator::AddSurfaceToSurfaceGroup },
58 { "RemoveSurfaceFromSurfaceGroup", "uu", "", &DBUSCommunicator::RemoveSurfaceFromSurfaceGroup },
59 { "AddLayerToLayerGroup", "uu", "", &DBUSCommunicator::AddLayerToLayerGroup},
60 { "RemoveLayerFromLayerGroup", "uu", "", &DBUSCommunicator::RemoveLayerFromLayerGroup },
61 { "AddSurfaceToLayer", "uu", "", &DBUSCommunicator::AddSurfaceToLayer },
62 { "RemoveSurfaceFromLayer", "uu", "", &DBUSCommunicator::RemoveSurfaceFromLayer},
63 { "CreateSurfaceGroup", "", "u", &DBUSCommunicator::CreateSurfaceGroup },
64 { "RemoveSurfaceGroup", "u", "", &DBUSCommunicator::RemoveSurfaceGroup},
65 { "CreateLayerGroup", "", "u", &DBUSCommunicator::CreateLayerGroup },
66 { "RemoveLayerGroup", "u", "", &DBUSCommunicator::RemoveLayerGroup },
67 { "SetSurfaceSourceRegion", "uuuuu", "", &DBUSCommunicator::SetSurfaceSourceRegion },
68 { "SetLayerSourceRegion", "uuuuu", "", &DBUSCommunicator::SetLayerSourceRegion},
69 { "SetSurfaceDestinationRegion", "uuuuu", "", &DBUSCommunicator::SetSurfaceDestinationRegion},
70 { "SetSurfacePosition", "uuu", "", &DBUSCommunicator::SetSurfacePosition },
71 { "GetSurfacePosition", "u", "uu", &DBUSCommunicator::GetSurfacePosition },
72 { "SetSurfaceDimension", "uuu", "", &DBUSCommunicator::SetSurfaceDimension},
73 { "SetLayerDestinationRegion", "uuuuu", "", &DBUSCommunicator::SetLayerDestinationRegion},
74 { "SetLayerPosition", "uuu", "", &DBUSCommunicator::SetLayerPosition},
75 { "GetLayerPosition", "u", "uu", &DBUSCommunicator::GetLayerPosition},
76 { "SetLayerDimension", "uuu", "", &DBUSCommunicator::SetLayerDimension},
77 { "GetLayerDimension", "u", "uu", &DBUSCommunicator::GetLayerDimension},
78 { "GetSurfaceDimension", "u", "uu", &DBUSCommunicator::GetSurfaceDimension},
79 { "SetSurfaceOpacity", "ud", "", &DBUSCommunicator::SetSurfaceOpacity},
80 { "SetLayerOpacity", "ud", "", &DBUSCommunicator::SetLayerOpacity },
81 { "SetSurfacegroupOpacity", "ud", "", &DBUSCommunicator::SetSurfacegroupOpacity },
82 { "SetLayergroupOpacity", "ud", "", &DBUSCommunicator::SetLayergroupOpacity },
83 { "GetSurfaceOpacity", "u", "d", &DBUSCommunicator::GetSurfaceOpacity },
84 { "GetLayerOpacity", "u", "d", &DBUSCommunicator::GetLayerOpacity },
85 { "GetSurfacegroupOpacity", "u", "d", &DBUSCommunicator::GetSurfacegroupOpacity },
86 { "GetLayergroupOpacity", "u", "d", &DBUSCommunicator::GetLayergroupOpacity },
87 { "SetSurfaceOrientation", "uu", "", &DBUSCommunicator::SetSurfaceOrientation },
88 { "SetLayerOrientation", "uu", "", &DBUSCommunicator::SetLayerOrientation },
89 { "GetSurfacePixelformat", "u", "u", &DBUSCommunicator::GetSurfacePixelformat },
90 { "SetSurfaceVisibility", "ub", "", &DBUSCommunicator::SetSurfaceVisibility },
91 { "SetLayerVisibility", "ub", "", &DBUSCommunicator::SetLayerVisibility },
92 { "GetSurfaceVisibility", "u", "b", &DBUSCommunicator::GetSurfaceVisibility },
93 { "GetLayerVisibility", "u", "b", &DBUSCommunicator::GetLayerVisibility },
94 { "SetSurfacegroupVisibility", "ub", "", &DBUSCommunicator::SetSurfacegroupVisibility },
95 { "SetLayergroupVisibility", "ub", "", &DBUSCommunicator::SetLayergroupVisibility },
96 { "SetRenderOrderOfLayers", "auu", "", &DBUSCommunicator::SetRenderOrderOfLayers },
97 { "SetSurfaceRenderOrderWithinLayer", "uau", "", &DBUSCommunicator::SetSurfaceRenderOrderWithinLayer },
98 { "GetLayerType", "u", "u",&DBUSCommunicator::GetLayerType },
99 { "GetLayertypeCapabilities", "u", "u", &DBUSCommunicator::GetLayertypeCapabilities },
100 { "GetLayerCapabilities", "u", "u", &DBUSCommunicator::GetLayerCapabilities },
101 { "Exit", "", "", &DBUSCommunicator::Exit },
102 { "CommitChanges", "", "", &DBUSCommunicator::CommitChanges },
103 { "CreateShader", "ss", "u", &DBUSCommunicator::CreateShader },
104 { "DestroyShader", "u", "", &DBUSCommunicator::DestroyShader},
105 { "SetShader", "uu", "", &DBUSCommunicator::SetShader },
106 { "SetUniforms", "uas", "", &DBUSCommunicator::SetUniforms },
112 DBusMessageIter iter;
113 DBusMessage* currentMsg;
115 dbus_uint32_t serial = 0;
116 DBusConnection* conn;
118 char* getStringFromMessage(){
121 if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&iter)){
122 LOG_ERROR("DBUSCommunicator", "Argument is not string!");
124 dbus_message_iter_get_basic(&iter, ¶m);
129 bool getBoolFromMessage(){
130 dbus_bool_t boolparam;
132 if (DBUS_TYPE_BOOLEAN != dbus_message_iter_get_arg_type(&iter)){
133 LOG_ERROR("DBUSCommunicator", "Argument is not bool!");
135 dbus_message_iter_get_basic(&iter, &boolparam);
145 char getByteFromMessage(){
148 if (DBUS_TYPE_BYTE != dbus_message_iter_get_arg_type(&iter)){
149 LOG_ERROR("DBUSCommunicator", "Argument is not byte!");
151 dbus_message_iter_get_basic(&iter, ¶m);
156 uint getUIntFromMessage(){
159 if (DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&iter)){
160 LOG_ERROR("DBUSCommunicator", "Argument is not uint32!");
162 dbus_message_iter_get_basic(&iter, ¶m);
169 double getDoubleFromMessage(){
172 if (DBUS_TYPE_DOUBLE != dbus_message_iter_get_arg_type(&iter)){
173 LOG_ERROR("DBUSCommunicator","Argument is not double!");
175 dbus_message_iter_get_basic(&iter, ¶m);
181 void appendBool(bool toAppend){
182 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &toAppend)) {
183 LOG_ERROR("DBUSCommunicator", "Out Of Memory!");
188 void appendUint(uint toAppend){
189 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &toAppend)) {
190 LOG_ERROR("DBUSCommunicator", "Out Of Memory!");
195 void appendDouble(double toAppend){
196 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_DOUBLE, &toAppend)) {
197 LOG_ERROR("DBUSCommunicator", "Out Of Memory!");
202 void appendbyte(char toAppend){
203 if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BYTE, &toAppend)) {
204 LOG_ERROR("DBUSCommunicator", "Out Of Memory!");
209 void initReceive(DBusMessage* msg){
211 if (!dbus_message_iter_init(currentMsg, &iter))
212 LOG_ERROR("DBUSCommunicator", "Message has no arguments!");
216 // create a reply from the message
217 reply = dbus_message_new_method_return(currentMsg);
218 dbus_message_iter_init_append(reply, &iter);
222 // send the reply && flush the connection
223 if (!dbus_connection_send(conn, reply, &serial)) {
224 LOG_ERROR("DBUSCommunicator", "Out Of Memory!");
227 dbus_connection_flush(conn);
230 dbus_message_unref(reply);
235 void addIntrospectHeader(std::string& str){
236 str.append("<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\" \n \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\"> \n");
239 void addIntrospectNode(std::string& str, std::string nodename){
240 str.append("<node name=\"" + nodename + "\"> \n");
243 void addIntrospectinterface(std::string& str, std::string interfacename){
244 str.append("<interface name=\"" + interfacename + "\"> \n");
247 void addIntrospectMethod(std::string& str, std::string methodname){
248 str.append("<method name=\"" + methodname + "\"> \n");
251 void addIntrospectArg(std::string& str, std::string argname,std::string direction,std::string type){
252 str.append("<arg name=\"" + argname + "\" direction=\"" + direction + "\" type=\"" + type + "\"/> \n");
255 void closeIntrospectMethod(std::string& str){
256 str.append("</method> \n");
259 void closeIntrospectInterface(std::string& str){
260 str.append("</interface> \n");
263 void closeIntrospectNode(std::string& str){
264 str.append("</node> \n");
267 std::string generateIntrospectionString(MethodTable* table){
268 LOG_DEBUG("DBUSCommunicator", "Generation introspection data");
269 std::string introspect;
270 addIntrospectHeader(introspect);
271 addIntrospectNode(introspect, "de.bmw.CompositingService");
272 addIntrospectinterface(introspect, "org.freedesktop.DBus.Introspectable");
273 addIntrospectMethod(introspect,"Introspect");
274 addIntrospectArg(introspect,"data","out","s");
275 closeIntrospectMethod(introspect);
276 closeIntrospectInterface(introspect);
278 addIntrospectinterface(introspect, "de.bmw.CompositingService");
281 while(strcmp(manager_methods[i].name,"")!=0){
282 MethodTable entry = table[i];
283 addIntrospectMethod(introspect,std::string(entry.name));
284 std::string signatureIN = std::string(entry.signature);
285 for (int c=0;c<signatureIN.length();c++){
286 switch(signatureIN.at(c)){
287 case 'a': addIntrospectArg(introspect,"","in","a" + signatureIN.at(c+1));c++; break;
288 default: addIntrospectArg(introspect,"","in","i"); break;
292 std::string reply = std::string(entry.reply);
293 for (int c=0;c<reply.length();c++){
295 case 'a':addIntrospectArg(introspect,"","out","a" + reply.at(c+1)); c++; break;
296 default:addIntrospectArg(introspect,"","out","i"); break;
300 closeIntrospectMethod(introspect);
304 closeIntrospectInterface(introspect);
306 closeIntrospectNode(introspect);
307 LOG_DEBUG("DBUSCommunicator", "returning introspection data");
311 DBUSCommunicator* DBUSCommunicator::m_reference = NULL;
313 DBUSCommunicator::DBUSCommunicator(CommandExecutor* executor, ILayerList* ll) : BaseCommunicator(executor,ll){
316 DBUSCommunicator::~DBUSCommunicator(){
320 void DBUSCommunicator::setdebug(bool onoff){
324 bool DBUSCommunicator::start(){
325 LOG_INFO("DBUSCommunicator", "Starting up dbus connector");
328 // initialise the error
329 dbus_error_init(&err);
331 // connect to the bus and check for errors
332 LOG_INFO("DBUSCommunicator","get DBUS Session");
333 conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
334 if (dbus_error_is_set(&err)) {
335 LOG_ERROR("DBUSCommunicator","Connection error");
336 dbus_error_free(&err);
339 LOG_ERROR("DBUSCommunicator","Connection is null");
342 LOG_INFO("DBUSCommunicator","request dbus name");
343 ret = dbus_bus_request_name(conn, "de.bmw.CompositingService", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
344 if (dbus_error_is_set(&err)) {
345 LOG_ERROR("DBUSCommunicator", "Name Error "<< err.message);
346 dbus_error_free(&err);
348 if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
349 LOG_ERROR("DBUSCommunicator", "Not Primary Owner "<< ret);
352 LOG_INFO("DBUSCommunicator","create thread");
353 this->m_running = true;
354 pthread_create(&m_currentThread, NULL, DBUSCommunicator::run, this);
355 LOG_INFO("DBUSCommunicator", "Started dbus connector");
359 void DBUSCommunicator::stop(){
360 LOG_INFO("DBUSCommunicator","stopping");
361 this->m_running = false;
362 pthread_join(m_currentThread,NULL);
364 dbus_error_init(&err);
365 bool errorset = dbus_error_is_set(&err);
367 LOG_ERROR("DBUSCommunicator","there was an dbus error");
368 LOG_INFO("ask about owner name",0);
369 dbus_bus_name_has_owner(conn,"de.bmw.CompositingService",&err);
370 errorset = dbus_error_is_set(&err);
372 LOG_ERROR("DBUSCommunicator","there was an dbus error");
373 dbus_error_init(&err);
374 dbus_bus_release_name(conn, "de.bmw.CompositingService",&err);
375 LOG_INFO("DBUSCommunicator", "Stopped dbus connector");
378 void introspectCallback(DBusConnection* conn,DBusMessage* msg )
381 DBusMessageIter args;
382 dbus_uint32_t serial = 0;
385 // create a reply from the message
386 reply = dbus_message_new_method_return(msg);
388 std::string introspect = generateIntrospectionString(manager_methods);
391 const char* string = introspect.c_str();
392 // add the arguments to the reply
393 dbus_message_iter_init_append(reply, &args);
394 if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &string)) {
395 LOG_ERROR("DBUSCommunicator", "Out Of Memory!");
399 // send the reply && flush the connection
400 if (!dbus_connection_send(conn, reply, &serial)) {
401 LOG_ERROR("DBUSCommunicator", "Out Of Memory!");
404 dbus_connection_flush(conn);
407 dbus_message_unref(reply);
410 void DBUSCommunicator::Debug(DBusConnection* conn,DBusMessage* msg )
413 bool param = getBoolFromMessage();
415 m_reference->m_executor->execute(new DebugCommand(param));
421 void DBUSCommunicator::ListAllLayerIDS(DBusConnection* conn,DBusMessage* msg )
426 m_reference->m_layerlist->getLayerIDs(&length,&array);
428 DBusMessageIter arrayIter;
429 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "u", &arrayIter);
430 for ( int i = 0; i< length;i++)
431 dbus_message_iter_append_basic(&arrayIter,DBUS_TYPE_UINT32,&array[i]);
432 dbus_message_iter_close_container(&iter,&arrayIter);
436 void DBUSCommunicator::ListAllSurfaceIDS(DBusConnection* conn,DBusMessage* msg )
441 m_reference->m_layerlist->getSurfaceIDs(&length,&array);
443 DBusMessageIter arrayIter;
444 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "u", &arrayIter);
445 for ( int i = 0; i< length;i++)
446 dbus_message_iter_append_basic(&arrayIter,DBUS_TYPE_UINT32,&array[i]);
447 dbus_message_iter_close_container(&iter,&arrayIter);
451 void DBUSCommunicator::ListAllLayerGroupIDS(DBusConnection* conn,DBusMessage* msg )
456 m_reference->m_layerlist->getLayerGroupIDs(&length,&array);
458 DBusMessageIter arrayIter;
459 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "u", &arrayIter);
460 for ( int i = 0; i< length;i++)
461 dbus_message_iter_append_basic(&arrayIter,DBUS_TYPE_UINT32,&array[i]);
462 dbus_message_iter_close_container(&iter,&arrayIter);
466 void DBUSCommunicator::ListAllSurfaceGroupIDS(DBusConnection* conn,DBusMessage* msg )
471 m_reference->m_layerlist->getSurfaceGroupIDs(&length,&array);
473 DBusMessageIter arrayIter;
474 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "u", &arrayIter);
475 for ( int i = 0; i< length;i++)
476 dbus_message_iter_append_basic(&arrayIter,DBUS_TYPE_UINT32,&array[i]);
477 dbus_message_iter_close_container(&iter,&arrayIter);
481 void DBUSCommunicator::ListSurfacesOfSurfacegroup(DBusConnection* conn,DBusMessage* msg )
484 uint id = getUIntFromMessage();
485 SurfaceGroup* sg = m_reference->m_layerlist->getSurfaceGroup(id);
486 std::list<Surface*> surfaces = sg->getList();
488 DBusMessageIter arrayIter;
489 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "u", &arrayIter);
490 for ( std::list<Surface*>::const_iterator it=surfaces.begin();it!=surfaces.end();it++){
493 dbus_message_iter_append_basic(&arrayIter,DBUS_TYPE_UINT32,&id);
495 dbus_message_iter_close_container(&iter,&arrayIter);
499 void DBUSCommunicator::ListLayersOfLayergroup(DBusConnection* conn,DBusMessage* msg )
502 uint id = getUIntFromMessage();
504 LayerGroup* sg = m_reference->m_layerlist->getLayerGroup(id);
505 std::list<Layer*> layers = sg->getList();
507 DBusMessageIter arrayIter;
508 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "u", &arrayIter);
509 for ( std::list<Layer*>::const_iterator it=layers.begin();it!=layers.end();it++){
512 dbus_message_iter_append_basic(&arrayIter,DBUS_TYPE_UINT32,&id);
514 dbus_message_iter_close_container(&iter,&arrayIter);
518 void DBUSCommunicator::ListSurfaceofLayer(DBusConnection* conn,DBusMessage* msg )
521 uint id = getUIntFromMessage();
523 Layer* layer = m_reference->m_layerlist->getLayer(id);
524 std::list<Surface*> surfaces = layer->getAllSurfaces();
526 DBusMessageIter arrayIter;
527 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "u", &arrayIter);
528 for ( std::list<Surface*>::const_iterator it=surfaces.begin();it!=surfaces.end();it++){
531 dbus_message_iter_append_basic(&arrayIter,DBUS_TYPE_UINT32,&id);
533 dbus_message_iter_close_container(&iter,&arrayIter);
537 void DBUSCommunicator::getPropertiesOfSurface(DBusConnection* conn,DBusMessage* msg )
540 uint id = getUIntFromMessage();
542 Surface* surface = m_reference->m_layerlist->getSurface(id);
545 appendDouble(surface->getOpacity());
546 Rectangle dest = surface->getDestinationRegion();
547 Rectangle src = surface->getDestinationRegion();
550 appendUint(src.width);
551 appendUint(src.height);
554 appendUint(dest.width);
555 appendUint(dest.height);
556 OrientationType orientation = surface->getOrientation();
557 appendbyte((char)orientation);
558 appendBool(surface->getVisibility());
562 void DBUSCommunicator::getPropertiesOfLayer(DBusConnection* conn,DBusMessage* msg )
565 uint id = getUIntFromMessage();
567 Layer* layer = m_reference->m_layerlist->getLayer(id);
570 appendDouble(layer->getOpacity());
571 Rectangle dest = layer->getDestinationRegion();
572 Rectangle src = layer->getDestinationRegion();
575 appendUint(src.width);
576 appendUint(src.height);
579 appendUint(dest.width);
580 appendUint(dest.height);
581 OrientationType orientation = layer->getOrientation();
582 appendbyte((char)orientation);
583 appendBool(layer->getVisibility());
587 void DBUSCommunicator::CreateSurface(DBusConnection* conn,DBusMessage* msg )
590 uint handle = getUIntFromMessage();
591 dbus_message_iter_next(&iter);
592 uint pixelformat = getUIntFromMessage();
593 PixelFormat pf = (PixelFormat)pixelformat;
595 dbus_message_iter_next(&iter);
596 uint width = getUIntFromMessage();
598 dbus_message_iter_next(&iter);
599 uint height = getUIntFromMessage();
601 m_reference->m_executor->execute(new CreateCommand(handle,TypeSurface,pf, width, height,&id));
607 void DBUSCommunicator::RemoveSurface(DBusConnection* conn,DBusMessage* msg )
610 uint param = getUIntFromMessage();
611 m_reference->m_executor->execute(new RemoveCommand(param,TypeSurface));
616 void DBUSCommunicator::CreateLayer(DBusConnection* conn,DBusMessage* msg )
620 m_reference->m_executor->execute(new CreateCommand(-1,TypeLayer,PIXELFORMAT_R8,0,0,&id));
626 void DBUSCommunicator::RemoveLayer(DBusConnection* conn,DBusMessage* msg )
629 uint param = getUIntFromMessage();
630 m_reference->m_executor->execute(new RemoveCommand(param,TypeLayer));
635 void DBUSCommunicator::AddSurfaceToSurfaceGroup(DBusConnection* conn,DBusMessage* msg )
638 uint surfaceid = getUIntFromMessage();
639 dbus_message_iter_next(&iter);
640 uint surfacegroupid = getUIntFromMessage();
641 m_reference->m_executor->execute(new SurfacegroupAddSurfaceCommand(surfacegroupid,surfaceid));
646 void DBUSCommunicator::RemoveSurfaceFromSurfaceGroup(DBusConnection* conn,DBusMessage* msg )
649 uint surfaceid = getUIntFromMessage();
650 dbus_message_iter_next(&iter);
651 uint surfacegroupid = getUIntFromMessage();
652 m_reference->m_executor->execute(new SurfacegroupRemoveSurfaceCommand(surfacegroupid,surfaceid));
657 void DBUSCommunicator::AddLayerToLayerGroup(DBusConnection* conn,DBusMessage* msg )
660 uint layerid = getUIntFromMessage();
661 dbus_message_iter_next(&iter);
662 uint layergroupid = getUIntFromMessage();
663 m_reference->m_executor->execute(new LayergroupAddLayerCommand(layergroupid,layerid));
668 void DBUSCommunicator::RemoveLayerFromLayerGroup(DBusConnection* conn,DBusMessage* msg )
671 uint layerid = getUIntFromMessage();
672 dbus_message_iter_next(&iter);
673 uint layergroupid = getUIntFromMessage();
674 m_reference->m_executor->execute(new LayergroupRemoveLayerCommand(layergroupid,layerid));
679 void DBUSCommunicator::AddSurfaceToLayer(DBusConnection* conn,DBusMessage* msg )
682 uint surfaceid = getUIntFromMessage();
683 dbus_message_iter_next(&iter);
684 uint layer = getUIntFromMessage();
685 m_reference->m_executor->execute(new LayerAddSurfaceCommand(layer,surfaceid));
690 void DBUSCommunicator::RemoveSurfaceFromLayer(DBusConnection* conn,DBusMessage* msg )
693 uint surfaceid = getUIntFromMessage();
694 dbus_message_iter_next(&iter);
695 uint layerid = getUIntFromMessage();
696 m_reference->m_executor->execute(new LayerRemoveSurfaceCommand(layerid,surfaceid));
701 void DBUSCommunicator::CreateSurfaceGroup(DBusConnection* conn,DBusMessage* msg )
705 m_reference->m_executor->execute(new CreateCommand(-1,TypeSurfaceGroup,PIXELFORMAT_R8,0,0,&newID));
712 void DBUSCommunicator::RemoveSurfaceGroup(DBusConnection* conn,DBusMessage* msg )
715 uint param = getUIntFromMessage();
716 m_reference->m_executor->execute(new RemoveCommand(param,TypeSurfaceGroup));
721 void DBUSCommunicator::CreateLayerGroup(DBusConnection* conn,DBusMessage* msg )
725 m_reference->m_executor->execute(new CreateCommand(-1,TypeLayerGroup,PIXELFORMAT_R8,0,0,&newID));
731 void DBUSCommunicator::RemoveLayerGroup(DBusConnection* conn,DBusMessage* msg )
734 uint param = getUIntFromMessage();
735 m_reference->m_executor->execute(new RemoveCommand(param,TypeLayerGroup));
740 void DBUSCommunicator::SetSurfaceSourceRegion(DBusConnection* conn,DBusMessage* msg )
743 uint id = getUIntFromMessage();
744 dbus_message_iter_next(&iter);
745 uint x = getUIntFromMessage();
746 dbus_message_iter_next(&iter);
747 uint y = getUIntFromMessage();
748 dbus_message_iter_next(&iter);
749 uint width = getUIntFromMessage();
750 dbus_message_iter_next(&iter);
751 uint height = getUIntFromMessage();
752 m_reference->m_executor->execute(new SetSourceRectangleCommand(id,TypeSurface,x,y,width,height));
757 void DBUSCommunicator::SetLayerSourceRegion(DBusConnection* conn,DBusMessage* msg )
760 uint id = getUIntFromMessage();
761 dbus_message_iter_next(&iter);
762 uint x = getUIntFromMessage();
763 dbus_message_iter_next(&iter);
764 uint y = getUIntFromMessage();
765 dbus_message_iter_next(&iter);
766 uint width = getUIntFromMessage();
767 dbus_message_iter_next(&iter);
768 uint height = getUIntFromMessage();
769 m_reference->m_executor->execute(new SetSourceRectangleCommand(id,TypeLayer,x,y,width,height));
774 void DBUSCommunicator::SetSurfaceDestinationRegion(DBusConnection* conn,DBusMessage* msg )
777 uint id = getUIntFromMessage();
778 dbus_message_iter_next(&iter);
779 uint x = getUIntFromMessage();
780 dbus_message_iter_next(&iter);
781 uint y = getUIntFromMessage();
782 dbus_message_iter_next(&iter);
783 uint width = getUIntFromMessage();
784 dbus_message_iter_next(&iter);
785 uint height = getUIntFromMessage();
786 m_reference->m_executor->execute(new SetDestinationRectangleCommand(id,TypeSurface,x,y,width,height));
791 void DBUSCommunicator::SetSurfacePosition(DBusConnection* conn,DBusMessage* msg )
794 uint id = getUIntFromMessage();
795 dbus_message_iter_next(&iter);
796 uint x = getUIntFromMessage();
797 dbus_message_iter_next(&iter);
798 uint y = getUIntFromMessage();
799 m_reference->m_executor->execute(new SetPositionCommand(id,TypeSurface,x,y));
804 void DBUSCommunicator::GetSurfacePosition(DBusConnection* conn,DBusMessage* msg )
807 uint id = getUIntFromMessage();
810 m_reference->m_executor->execute(new GetPositionCommand(id,TypeSurface,&x,&y));
817 void DBUSCommunicator::SetSurfaceDimension(DBusConnection* conn,DBusMessage* msg )
820 uint id = getUIntFromMessage();
821 dbus_message_iter_next(&iter);
822 uint width = getUIntFromMessage();
823 dbus_message_iter_next(&iter);
824 uint height = getUIntFromMessage();
825 m_reference->m_executor->execute(new SetDimensionCommand(id,TypeSurface,width,height));
830 void DBUSCommunicator::SetLayerDestinationRegion(DBusConnection* conn,DBusMessage* msg )
833 uint id = getUIntFromMessage();
834 dbus_message_iter_next(&iter);
835 uint x = getUIntFromMessage();
836 dbus_message_iter_next(&iter);
837 uint y = getUIntFromMessage();
838 dbus_message_iter_next(&iter);
839 uint width = getUIntFromMessage();
840 dbus_message_iter_next(&iter);
841 uint height = getUIntFromMessage();
842 m_reference->m_executor->execute(new SetDestinationRectangleCommand(id,TypeLayer,x,y,width,height));
847 void DBUSCommunicator::SetLayerPosition(DBusConnection* conn,DBusMessage* msg )
850 uint id = getUIntFromMessage();
851 dbus_message_iter_next(&iter);
852 uint x = getUIntFromMessage();
853 dbus_message_iter_next(&iter);
854 uint y = getUIntFromMessage();
855 m_reference->m_executor->execute(new SetPositionCommand(id,TypeLayer,x,y));
860 void DBUSCommunicator::GetLayerPosition(DBusConnection* conn,DBusMessage* msg )
863 uint id = getUIntFromMessage();
866 m_reference->m_executor->execute(new GetPositionCommand(id,TypeLayer,&x,&y));
873 void DBUSCommunicator::SetLayerDimension(DBusConnection* conn,DBusMessage* msg )
876 uint id = getUIntFromMessage();
877 dbus_message_iter_next(&iter);
878 uint width = getUIntFromMessage();
879 dbus_message_iter_next(&iter);
880 uint height = getUIntFromMessage();
881 m_reference->m_executor->execute(new SetDimensionCommand(id,TypeLayer,width,height));
886 void DBUSCommunicator::GetLayerDimension(DBusConnection* conn,DBusMessage* msg )
889 uint id = getUIntFromMessage();
892 m_reference->m_executor->execute(new GetDimensionCommand(id,TypeLayer,&width,&height));
899 void DBUSCommunicator::GetSurfaceDimension(DBusConnection* conn,DBusMessage* msg )
902 uint id = getUIntFromMessage();
905 m_reference->m_executor->execute(new GetDimensionCommand(id,TypeSurface,&width,&height));
912 void DBUSCommunicator::SetSurfaceOpacity(DBusConnection* conn,DBusMessage* msg )
915 uint id = getUIntFromMessage();
916 dbus_message_iter_next(&iter);
917 double param = getDoubleFromMessage();
918 m_reference->m_executor->execute(new SetOpacityCommand(id,TypeSurface,param));
923 void DBUSCommunicator::SetLayerOpacity(DBusConnection* conn,DBusMessage* msg )
926 uint id = getUIntFromMessage();
927 dbus_message_iter_next(&iter);
928 double param = getDoubleFromMessage();
929 m_reference->m_executor->execute(new SetOpacityCommand(id,TypeLayer,param));
934 void DBUSCommunicator::SetSurfacegroupOpacity(DBusConnection* conn,DBusMessage* msg )
937 uint id = getUIntFromMessage();
938 dbus_message_iter_next(&iter);
939 double param = getDoubleFromMessage();
940 m_reference->m_executor->execute(new SetOpacityCommand(id,TypeSurfaceGroup,param));
945 void DBUSCommunicator::SetLayergroupOpacity(DBusConnection* conn,DBusMessage* msg )
948 uint id = getUIntFromMessage();
949 dbus_message_iter_next(&iter);
950 double param = getDoubleFromMessage();
951 m_reference->m_executor->execute(new SetOpacityCommand(id,TypeLayerGroup,param));
956 void DBUSCommunicator::GetSurfaceOpacity(DBusConnection* conn,DBusMessage* msg )
959 uint id = getUIntFromMessage();
961 m_reference->m_executor->execute(new GetOpacityCommand(id,TypeSurface,¶m));
967 void DBUSCommunicator::GetLayerOpacity(DBusConnection* conn,DBusMessage* msg )
970 uint id = getUIntFromMessage();
972 m_reference->m_executor->execute(new GetOpacityCommand(id,TypeLayer,¶m));
978 void DBUSCommunicator::GetSurfacegroupOpacity(DBusConnection* conn,DBusMessage* msg )
981 uint id = getUIntFromMessage();
983 m_reference->m_executor->execute(new GetOpacityCommand(id,TypeSurfaceGroup,¶m));
989 void DBUSCommunicator::GetLayergroupOpacity(DBusConnection* conn,DBusMessage* msg )
992 uint id = getUIntFromMessage();
994 m_reference->m_executor->execute(new GetOpacityCommand(id,TypeLayerGroup,¶m));
1000 void DBUSCommunicator::SetSurfaceOrientation(DBusConnection* conn,DBusMessage* msg )
1003 uint id = getUIntFromMessage();
1004 dbus_message_iter_next(&iter);
1005 uint param = getUIntFromMessage();
1006 OrientationType o = (OrientationType) param;
1007 m_reference->m_executor->execute(new SetOrientationCommand(id,TypeSurface,o));
1012 void DBUSCommunicator::SetLayerOrientation(DBusConnection* conn,DBusMessage* msg )
1015 uint id = getUIntFromMessage();
1016 dbus_message_iter_next(&iter);
1017 uint param = getUIntFromMessage();
1018 OrientationType o = (OrientationType) param;
1019 m_reference->m_executor->execute(new SetOrientationCommand(id,TypeLayer,o));
1024 void DBUSCommunicator::GetSurfacePixelformat(DBusConnection* conn,DBusMessage* msg )
1027 uint id = getUIntFromMessage();
1029 m_reference->m_executor->execute(new GetPixelformatCommand(id,TypeSurface,¶m));
1035 void DBUSCommunicator::SetSurfaceVisibility(DBusConnection* conn,DBusMessage* msg )
1038 const uint surfaceid = getUIntFromMessage();
1039 dbus_message_iter_next(&iter);
1040 bool newVis= getBoolFromMessage();
1041 m_reference->m_executor->execute(new SetVisibilityCommand(surfaceid,TypeSurface,newVis));
1046 void DBUSCommunicator::SetLayerVisibility(DBusConnection* conn,DBusMessage* msg )
1049 uint layerid = getUIntFromMessage();
1050 dbus_message_iter_next(&iter);
1051 bool myparam = getBoolFromMessage();
1052 m_reference->m_executor->execute(new SetVisibilityCommand(layerid,TypeLayer,myparam));
1057 void DBUSCommunicator::GetSurfaceVisibility(DBusConnection* conn,DBusMessage* msg )
1060 uint id = getUIntFromMessage();
1062 m_reference->m_executor->execute(new GetVisibilityCommand(id,TypeSurface,¶m));
1068 void DBUSCommunicator::GetLayerVisibility(DBusConnection* conn,DBusMessage* msg )
1071 uint id = getUIntFromMessage();
1073 m_reference->m_executor->execute(new GetVisibilityCommand(id,TypeLayer,¶m));
1079 void DBUSCommunicator::SetSurfacegroupVisibility(DBusConnection* conn,DBusMessage* msg )
1082 uint groupid = getUIntFromMessage();
1083 dbus_message_iter_next(&iter);
1084 bool myparam = getBoolFromMessage();
1085 m_reference->m_executor->execute(new SetVisibilityCommand(groupid,TypeSurfaceGroup,myparam));
1090 void DBUSCommunicator::SetLayergroupVisibility(DBusConnection* conn,DBusMessage* msg )
1093 uint groupid = getUIntFromMessage();
1094 dbus_message_iter_next(&iter);
1095 bool myparam = getBoolFromMessage();
1096 m_reference->m_executor->execute(new SetVisibilityCommand(groupid,TypeLayerGroup,myparam));
1101 void DBUSCommunicator::SetRenderOrderOfLayers(DBusConnection* conn,DBusMessage* msg )
1104 if (DBUS_TYPE_ARRAY != dbus_message_iter_get_arg_type(&iter))
1105 LOG_ERROR("DBUSCommunicator","Argument is not an array!");
1106 DBusMessageIter arrayIter;
1107 dbus_message_iter_recurse(&iter,&arrayIter);
1110 dbus_message_iter_get_fixed_array(&arrayIter,&arr,&length);
1112 m_reference->m_executor->execute(new SetLayerOrderCommand(arr,length));
1118 void DBUSCommunicator::SetSurfaceRenderOrderWithinLayer(DBusConnection* conn,DBusMessage* msg )
1121 uint layerid = getUIntFromMessage();
1122 dbus_message_iter_next(&iter);
1124 if (DBUS_TYPE_ARRAY != dbus_message_iter_get_arg_type(&iter))
1125 LOG_ERROR("DBUSCommunicator", "Argument is not an array!");
1126 DBusMessageIter arrayIter;
1127 dbus_message_iter_recurse(&iter,&arrayIter);
1130 dbus_message_iter_get_fixed_array(&arrayIter,&arr,&length);
1132 m_reference->m_executor->execute(new SetOrderWithinLayerCommand(layerid,arr,length));
1138 void DBUSCommunicator::GetLayerType(DBusConnection* conn,DBusMessage* msg )
1141 uint id = getUIntFromMessage();
1142 Layer* l = m_reference->m_layerlist->getLayer(id);
1144 appendUint(l->getLayerType());
1148 void DBUSCommunicator::GetLayertypeCapabilities(DBusConnection* conn,DBusMessage* msg )
1152 uint id = getUIntFromMessage();
1153 LayerType type = (LayerType)id;
1154 uint capabilities = m_reference->m_executor->getLayerTypeCapabilities(type);
1156 appendUint(capabilities);
1160 void DBUSCommunicator::GetLayerCapabilities(DBusConnection* conn,DBusMessage* msg )
1163 uint id = getUIntFromMessage();
1164 Layer* l = m_reference->m_layerlist->getLayer(id);
1166 appendUint(l->getCapabilities());
1170 void DBUSCommunicator::FadeIn(DBusConnection* conn,DBusMessage* msg )
1177 void DBUSCommunicator::SynchronizedFade(DBusConnection* conn,DBusMessage* msg )
1184 void DBUSCommunicator::FadeOut(DBusConnection* conn,DBusMessage* msg )
1191 void DBUSCommunicator::Exit(DBusConnection* conn,DBusMessage* msg )
1194 m_reference->m_executor->execute(new ExitCommand());
1199 void DBUSCommunicator::CommitChanges(DBusConnection* conn,DBusMessage* msg )
1202 m_reference->m_executor->execute(new CommitCommand());
1207 void DBUSCommunicator::CreateShader(DBusConnection* conn,DBusMessage* msg )
1210 char* vertname = getStringFromMessage();
1211 dbus_message_iter_next(&iter);
1212 char* fragname = getStringFromMessage();
1214 m_reference->m_executor->execute(new CreateShaderCommand(vertname,fragname,&id));
1220 void DBUSCommunicator::DestroyShader(DBusConnection* conn,DBusMessage* msg )
1223 uint shaderid = getUIntFromMessage();
1224 m_reference->m_executor->execute(new DestroyShaderCommand(shaderid));
1229 void DBUSCommunicator::SetShader(DBusConnection* conn,DBusMessage* msg )
1232 uint objectid = getUIntFromMessage();
1233 dbus_message_iter_next(&iter);
1234 uint shaderid = getUIntFromMessage();
1235 m_reference->m_executor->execute(new SetShaderCommand(objectid,shaderid));
1240 void DBUSCommunicator::SetUniforms(DBusConnection* conn,DBusMessage* msg )
1243 uint id = getUIntFromMessage();
1244 dbus_message_iter_next(&iter);
1245 if (DBUS_TYPE_ARRAY != dbus_message_iter_get_arg_type(&iter))
1246 LOG_ERROR("DBUSCommunicator", "Argument is not an array!");
1247 std::vector<std::string> uniforms;
1248 DBusMessageIter arrayIter;
1250 dbus_message_iter_recurse(&iter,&arrayIter);
1251 bool hasNext = true;
1253 if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&arrayIter))
1254 LOG_ERROR("DBUSCommunicator", "Argument is not an string!");
1256 dbus_message_iter_get_basic(&arrayIter,¶m);
1257 uniforms.push_back(std::string(param));
1258 if (dbus_message_iter_has_next(&arrayIter))
1259 dbus_message_iter_next(&arrayIter);
1264 m_reference->m_executor->execute(new SetUniformsCommand(id,uniforms));
1269 void* DBUSCommunicator::run(void * arg){
1270 LOG_INFO("DBUSCommunicator","Running..");
1271 // pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL);
1272 // pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
1273 m_reference = (DBUSCommunicator*)arg;
1274 while(m_reference->m_running){
1275 // pthread_testcancel();
1276 dbus_connection_read_write(conn, 50);
1277 DBusMessage* msg = dbus_connection_pop_message(conn);
1279 const char *n = dbus_message_get_member (msg);
1283 while(!found && strcmp(manager_methods[i].name,"")!=0){
1284 if (n && strcmp(manager_methods[i].name,n) == 0){
1285 MethodTable entry = manager_methods[i];
1286 LOG_DEBUG("DBUSC","called methodname:" << entry.name);
1287 CallBackMethod m = entry.function;
1288 (m_reference->*m)(conn,msg);
1293 if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")){
1294 LOG_DEBUG("DBUSCommunicator", "Introspection called");
1295 introspectCallback(conn, msg);
1299 DBusMessage* reply = dbus_message_new_method_return(msg);
1301 // send the reply && flush the connection
1302 if (!dbus_connection_send(conn, reply, &serial)) {
1303 LOG_ERROR("DBUSCommunicator", "Out Of Memory!");
1306 dbus_connection_flush(conn);
1309 dbus_message_unref(reply);
1315 LOG_DEBUG("DBUSCommunicator","ending thread");
1319 extern "C" DBUSCommunicator* createDBUSCommunicator(CommandExecutor* executor, LayerList* ll) {
1320 return new DBUSCommunicator(executor,ll);
1323 extern "C" void destroyDBUSCommunicator(DBUSCommunicator* p) {