diff --git a/client/src/core/linux/request.cc b/client/src/core/linux/request.cc index 10609f6..6d6f92b 100644 --- a/client/src/core/linux/request.cc +++ b/client/src/core/linux/request.cc @@ -46,37 +46,38 @@ IPC::Request::Request(DBusConnection * conn) { this->conn = conn; - this->msg.in = nullptr; - this->msg.out = nullptr; + this->response.msg = nullptr; + this->request.msg = nullptr; } IPC::Request::~Request() { - if(msg.out) { - dbus_message_unref(msg.out); + if(request.msg) { + dbus_message_unref(request.msg); } - if(msg.in) { - dbus_message_unref(msg.in); + + if(response.msg) { + dbus_message_unref(response.msg); } } IPC::Request & IPC::Request::call() { - if(msg.in) { - dbus_message_unref(msg.in); - msg.in = nullptr; + if(response.msg) { + dbus_message_unref(response.msg); + response.msg = nullptr; } DBusError error; dbus_error_init(&error); - this->msg.in = dbus_connection_send_with_reply_and_block(this->conn,this->msg.out,10000,&error); + response.msg = dbus_connection_send_with_reply_and_block(this->conn,request.msg,10000,&error); - if(!this->msg.in) { + if(!response.msg) { string message = error.message; dbus_error_free(&error); throw std::runtime_error(message.c_str()); } - dbus_message_iter_init(msg.in, &msg.iter); + dbus_message_iter_init(response.msg, &response.iter); // debug(__FUNCTION__," got a valid response"); @@ -84,46 +85,53 @@ } + IPC::Request & IPC::Request::push(int type, const void *value) { + + DBusMessageIter iter; + dbus_message_iter_init_append(request.msg, &iter); + + if (!dbus_message_iter_append_basic(&iter,type,value)) { + throw std::runtime_error("Can't append value"); + } + + return *this; + + } + IPC::Request & IPC::Request::push(const char *arg) { - dbus_message_append_args(this->msg.out,DBUS_TYPE_STRING,&arg,DBUS_TYPE_INVALID); - return *this; + return push(DBUS_TYPE_STRING,&arg); } IPC::Request & IPC::Request::push(const bool arg) { - dbus_message_append_args(this->msg.out,DBUS_TYPE_BOOLEAN,&arg,DBUS_TYPE_INVALID); - return *this; + return push(DBUS_TYPE_BOOLEAN,&arg); } IPC::Request & IPC::Request::push(const uint8_t arg) { - dbus_message_append_args(this->msg.out,DBUS_TYPE_BYTE,&arg,DBUS_TYPE_INVALID); - return *this; + return push(DBUS_TYPE_BYTE,&arg); } IPC::Request & IPC::Request::push(const int32_t arg) { - dbus_message_append_args(this->msg.out,DBUS_TYPE_INT32,&arg,DBUS_TYPE_INVALID); - return *this; + return push(DBUS_TYPE_INT32,&arg); } IPC::Request & IPC::Request::push(const uint32_t arg) { - dbus_message_append_args(this->msg.out,DBUS_TYPE_UINT32,&arg,DBUS_TYPE_INVALID); - return *this; + return push(DBUS_TYPE_UINT32,&arg); } - IPC::Request & IPC::Request::pop(std::string &value) { const char * str = ""; - if(dbus_message_iter_get_arg_type(&msg.iter) == DBUS_TYPE_STRING) { + if(dbus_message_iter_get_arg_type(&response.iter) == DBUS_TYPE_STRING) { - dbus_message_iter_get_basic(&msg.iter, &str); + dbus_message_iter_get_basic(&response.iter, &str); - } else if(dbus_message_iter_get_arg_type(&msg.iter) == DBUS_TYPE_VARIANT) { + } else if(dbus_message_iter_get_arg_type(&response.iter) == DBUS_TYPE_VARIANT) { DBusMessageIter sub; int current_type; - dbus_message_iter_recurse(&msg.iter, &sub); + dbus_message_iter_recurse(&response.iter, &sub); while ((current_type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) { @@ -136,12 +144,12 @@ } else { - debug("Argument type is ", ((char) dbus_message_iter_get_arg_type(&msg.iter)) ); + debug("Argument type is ", ((char) dbus_message_iter_get_arg_type(&response.iter)) ); throw std::runtime_error("Expected an string data type"); } - dbus_message_iter_next(&msg.iter); + dbus_message_iter_next(&response.iter); value.assign(str); @@ -304,8 +312,8 @@ IPC::Request & IPC::Request::Request::pop(int &value) { - value = getIntValue(msg.iter); - dbus_message_iter_next(&msg.iter); + value = getIntValue(response.iter); + dbus_message_iter_next(&response.iter); // debug(__FUNCTION__,"= \"",value,"\""); return *this; @@ -314,8 +322,8 @@ IPC::Request & IPC::Request::Request::pop(unsigned int &value) { - value = getUIntValue(msg.iter); - dbus_message_iter_next(&msg.iter); + value = getUIntValue(response.iter); + dbus_message_iter_next(&response.iter); // debug(__FUNCTION__,"= \"",value,"\""); return *this; @@ -324,8 +332,8 @@ IPC::Request & IPC::Request::Request::pop(bool &value) { - value = getBooleanValue(msg.iter); - dbus_message_iter_next(&msg.iter); + value = getBooleanValue(response.iter); + dbus_message_iter_next(&response.iter); // debug(__FUNCTION__,"= \"",value,"\""); return *this; diff --git a/client/src/include/lib3270/ipc/request.h b/client/src/include/lib3270/ipc/request.h index 2a57453..49cd6f8 100644 --- a/client/src/include/lib3270/ipc/request.h +++ b/client/src/include/lib3270/ipc/request.h @@ -105,12 +105,17 @@ uint16_t * outvalues; #else + /// @brief Message received from server. struct { - DBusMessage * in; - DBusMessage * out; + DBusMessage * msg; DBusMessageIter iter; + } response; + + /// @brief Message who will be sent to server. + struct { + DBusMessage * msg; + } request; - } msg; DBusConnection * conn; Request(DBusConnection * conn); @@ -121,6 +126,11 @@ #ifdef _WIN32 Request(HANDLE hPipe, const char *name, uint16_t type); + +#else + + IPC::Request & push(int type, const void *value); + #endif // _WIN32 public: diff --git a/client/src/session/remote/linux/request.cc b/client/src/session/remote/linux/request.cc index d5938de..4337634 100644 --- a/client/src/session/remote/linux/request.cc +++ b/client/src/session/remote/linux/request.cc @@ -49,18 +49,14 @@ IPC::Request::Request(const IPC::Session &session, const char *method) : Request(session.conn) { -#ifdef DEBUG - clog << "Creating request \"" << method << "\"" << endl; -#endif // DEBUG - - this->msg.out = dbus_message_new_method_call( + request.msg = dbus_message_new_method_call( session.name.c_str(), // Destination session.path.c_str(), // Path session.interface.c_str(), // Interface method // Method ); - if(!msg.out) { + if(!request.msg) { throw std::runtime_error("Can't create D-Bus Method Call"); } @@ -68,14 +64,14 @@ IPC::Request::Request(const IPC::Session &session, bool isSet, const char *property) : Request(session.conn) { - this->msg.out = dbus_message_new_method_call( + request.msg = dbus_message_new_method_call( session.name.c_str(), // Destination session.path.c_str(), // Path "org.freedesktop.DBus.Properties", // Interface (isSet ? "Set" : "Get") ); - if(!msg.out) { + if(!request.msg) { throw std::runtime_error("Can't create D-Bus Property Call"); } @@ -89,12 +85,8 @@ // const char *interface_name = session.interface.c_str(); - dbus_message_append_args( - this->msg.out, - DBUS_TYPE_STRING,&interface_name, - DBUS_TYPE_STRING,&property, - DBUS_TYPE_INVALID - ); + push(DBUS_TYPE_STRING,&interface_name); + push(DBUS_TYPE_STRING,&property); } diff --git a/server/testscripts/geturl.sh b/server/testscripts/geturl.sh new file mode 100755 index 0000000..bb745b0 --- /dev/null +++ b/server/testscripts/geturl.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# +# https://stackoverflow.com/questions/48648952/set-get-property-using-dbus-send +# + +#dbus-send \ +# --session \ +# --dest=br.com.bb.pw3270.a\ +# --print-reply \ +# "/br/com/bb/tn3270/session" \ +# "org.freedesktop.DBus.Properties.Get" \ +# string:br.com.bb.tn3270.session \ +# string:url + + +gdbus \ + call \ + --session \ + --dest "br.com.bb.pw3270.a" \ + --object-path "/br/com/bb/tn3270/session" \ + --method org.freedesktop.DBus.Properties.Get \ + "br.com.bb.tn3270.session" \ + "url" + diff --git a/server/testscripts/seturl.sh b/server/testscripts/seturl.sh new file mode 100755 index 0000000..e7dbad7 --- /dev/null +++ b/server/testscripts/seturl.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# +# https://stackoverflow.com/questions/48648952/set-get-property-using-dbus-send +# + +dbus-send \ + --session \ + --dest=br.com.bb.pw3270.a\ + --print-reply \ + "/br/com/bb/tn3270/session" \ + "org.freedesktop.DBus.Properties.Set" \ + string:br.com.bb.tn3270.session \ + string:url \ + variant:string:${1} + + +#dbus-send --system --dest=$BUS_NAME --print-reply $OBJECT_PATH \ + #org.freedesktop.DBus.Properties.Set string:com.pgaur.GDBUS string:Status variant:uint32:10 + +#gdbus \ +# introspect \ +# --session \ +# --dest=br.com.bb.pw3270.a \ +# --object-path=/br/com/bb/tn3270/session + +#gdbus \ +# call \ +# --session \ +# --dest br.com.bb.pw3270.a \ +# --object-path /br/com/bb/tn3270/session \ +# --method org.freedesktop.DBus.Properties.Set \ +# "br.com.bb.tn3270.session" \ +# "url" \ +# ${1} + + + -- libgit2 0.21.2