1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 #ifndef COMMONAPI_DBUS_DBUS_PROXY_HELPER_H_
5 #define COMMONAPI_DBUS_DBUS_PROXY_HELPER_H_
7 #include "DBusMessage.h"
8 #include "DBusSerializableArguments.h"
9 #include "DBusProxyAsyncCallbackHandler.h"
23 template< class, class >
24 struct DBusProxyHelper;
27 template <class...> class _In, class... _InArgs,
28 template <class...> class _Out, class... _OutArgs>
29 struct DBusProxyHelper<_In<_InArgs...>, _Out<_OutArgs...>> {
30 template <typename _DBusProxy = DBusProxy>
31 static void callMethod(const _DBusProxy& dbusProxy,
32 const char* methodName,
33 const char* methodSignature,
34 const _InArgs&... inArgs,
35 CommonAPI::CallStatus& callStatus) {
36 if (dbusProxy.isAvailableBlocking()) {
38 DBusMessage dbusMessage = dbusProxy.createMethodCall(methodName, methodSignature);
40 if (sizeof...(_InArgs) > 0) {
41 DBusOutputStream outputStream(dbusMessage);
42 const bool success = DBusSerializableArguments<_InArgs...>::serialize(outputStream, inArgs...);
44 callStatus = CallStatus::OUT_OF_MEMORY;
50 const bool dbusMessageSent = dbusProxy.getDBusConnection()->sendDBusMessage(dbusMessage);
51 callStatus = dbusMessageSent ? CallStatus::SUCCESS : CallStatus::OUT_OF_MEMORY;
53 callStatus = CallStatus::NOT_AVAILABLE;
57 template <typename _DBusProxy = DBusProxy>
58 static void callMethodWithReply(
59 const _DBusProxy& dbusProxy,
60 const char* methodName,
61 const char* methodSignature,
62 const _InArgs&... inArgs,
63 CommonAPI::CallStatus& callStatus,
64 _OutArgs&... outArgs) {
66 if (dbusProxy.isAvailableBlocking()) {
68 DBusMessage dbusMethodCall = dbusProxy.createMethodCall(methodName, methodSignature);
70 if (sizeof...(_InArgs) > 0) {
71 DBusOutputStream outputStream(dbusMethodCall);
72 const bool success = DBusSerializableArguments<_InArgs...>::serialize(outputStream, inArgs...);
74 callStatus = CallStatus::OUT_OF_MEMORY;
81 DBusMessage dbusMessageReply = dbusProxy.getDBusConnection()->sendDBusMessageWithReplyAndBlock(dbusMethodCall, dbusError);
82 if (dbusError || !dbusMessageReply.isMethodReturnType()) {
83 callStatus = CallStatus::REMOTE_ERROR;
87 if (sizeof...(_OutArgs) > 0) {
88 DBusInputStream inputStream(dbusMessageReply);
89 const bool success = DBusSerializableArguments<_OutArgs...>::deserialize(inputStream, outArgs...);
91 callStatus = CallStatus::REMOTE_ERROR;
96 callStatus = CallStatus::SUCCESS;
98 callStatus = CallStatus::NOT_AVAILABLE;
102 template <typename _DBusProxy = DBusProxy, typename _AsyncCallback>
103 static std::future<CallStatus> callMethodAsync(
104 const _DBusProxy& dbusProxy,
105 const char* methodName,
106 const char* methodSignature,
107 const _InArgs&... inArgs,
108 _AsyncCallback asyncCallback) {
110 if (dbusProxy.isAvailable()) {
112 DBusMessage dbusMessage = dbusProxy.createMethodCall(methodName, methodSignature);
114 if (sizeof...(_InArgs) > 0) {
115 DBusOutputStream outputStream(dbusMessage);
116 const bool success = DBusSerializableArguments<_InArgs...>::serialize(outputStream, inArgs...);
118 std::promise<CallStatus> promise;
119 promise.set_value(CallStatus::OUT_OF_MEMORY);
120 return promise.get_future();
122 outputStream.flush();
125 return dbusProxy.getDBusConnection()->sendDBusMessageWithReplyAsync(
127 DBusProxyAsyncCallbackHandler<_OutArgs...>::create(std::move(asyncCallback)));
129 std::promise<CallStatus> promise;
130 promise.set_value(CallStatus::NOT_AVAILABLE);
131 return promise.get_future();
137 } // namespace CommonAPI
139 #endif // COMMONAPI_DBUS_DBUS_PROXY_HELPER_H_