update on dbus
[profile/ivi/genivi/genivi-audio-manager.git] / PluginCommandInterfaceDbus / DBUSMessageHandler.h
1 /***************************************************************************
2  *
3  * Copyright 2010,2011 BMW Car IT GmbH
4  *
5  *
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
9  *
10  *        http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  ****************************************************************************/
19
20 #ifndef _DBUSMESSAGEHANDLER_H_
21 #define _DBUSMESSAGEHANDLER_H_
22
23 #include <vector>
24 #include <sstream>
25 using std::stringstream;
26
27 #include <string>
28 using std::string;
29
30 #include "headers.h"
31 #include <dbus/dbus.h>
32
33 #define DLT_CONTEXT DBusCommandPlugin
34
35 typedef void (CommandDbusReceive::*CallBackMethod)(DBusConnection *connection, DBusMessage *message);
36
37 struct MethodTable
38 {
39     const char *name;
40     const char *signature;
41     const char *reply;
42     CallBackMethod function;
43 };
44
45 struct SignalTable {
46         const char* name;
47         const char* signature;
48 };
49
50
51 class DBUSMessageHandler
52 {
53 public:
54         DBUSMessageHandler(DBusObjectPathVTable* vtable, DBusConnection* conn, void* reference);
55     ~DBUSMessageHandler();
56
57     void initReceive(DBusMessage* msg);
58     void initReply(DBusMessage* msg);
59     void closeReply();
60     void ReplyError(DBusMessage* msg, const char* errorname, const char* errorMsg);
61
62     dbus_uint32_t getUInt();
63     char getByte();
64     dbus_bool_t getBool();
65     double getDouble();
66     char* getString();
67     void getArrayOfUInt(int* length, unsigned int** array);
68     void getArrayOfString(std::vector<std::string>* uniforms);
69
70     void append(dbus_uint32_t toAppend);
71     void append(char toAppend);
72     void append(bool toAppend);
73     void append(double toAppend);
74     void append(unsigned int length, unsigned int *IDs);
75     void append(std::list<SourceType> list);
76     void append(std::list<ConnectionType> list);
77     void append(std::list<SinkType> list);
78
79     void sendSignal(const char* signalname);
80
81 private:
82     DBusMessageIter m_MessageIter;
83     DBusMessage* m_pReply;
84     dbus_uint32_t m_serial;
85     DBusConnection* m_pConnection;
86     DBusError m_err;
87 };
88
89 class DBUSIntrospection
90 {
91 public:
92     DBUSIntrospection(MethodTable* table, SignalTable* stable,std::string nodename);
93     void process(DBusConnection* conn, DBusMessage* msg);
94
95 private:
96     void generateString(void);
97
98     void addHeader(void);
99     void addArgument(string argname, string direction, string type);
100     void addSignalArgument(string argname, string type);
101     void addEntry(MethodTable entry);
102     void addEntry(SignalTable entry);
103
104     void openNode(string nodename);
105     void closeNode(void);
106
107     void openInterface(string interfacename);
108     void closeInterface(void);
109
110     void openMethod(string methodname);
111     void closeMethod(void);
112
113     void openSignal(string signalname);
114     void closeSignal(void);
115
116 private:
117     stringstream m_introspectionString;
118     MethodTable* m_methodTable;
119     SignalTable* m_signalTable;
120     std::string m_nodename;
121 };
122
123 #endif // _DBUSMESSAGEWRAPPER_H_