ENH: linux: refine the d-bus name
github: #3075 Change-Id: Icf997f4f9203f4d429e3b6058d6d6e5f23bf29ac (cherry picked from commit 5c766bff445cefee488ba9d057121b04c8e1445d)
This commit is contained in:
parent
53d8085833
commit
ece83b13c8
|
@ -74,15 +74,15 @@ namespace instance_check_internal
|
||||||
ret.should_send = false;
|
ret.should_send = false;
|
||||||
else
|
else
|
||||||
arguments.emplace_back(token);
|
arguments.emplace_back(token);
|
||||||
}
|
}
|
||||||
ret.cl_string = escape_strings_cstyle(arguments);
|
ret.cl_string = escape_strings_cstyle(arguments);
|
||||||
BOOST_LOG_TRIVIAL(debug) << "single instance: " <<
|
BOOST_LOG_TRIVIAL(debug) << "single instance: " <<
|
||||||
(ret.should_send.has_value() ? (*ret.should_send ? "true" : "false") : "undefined") <<
|
(ret.should_send.has_value() ? (*ret.should_send ? "true" : "false") : "undefined") <<
|
||||||
". other params: " << ret.cl_string;
|
". other params: " << ret.cl_string;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ namespace instance_check_internal
|
||||||
std::wstring wndTextString(wndText);
|
std::wstring wndTextString(wndText);
|
||||||
if (wndTextString.find(L"BambuStudio") != std::wstring::npos && classNameString == L"wxWindowNR") {
|
if (wndTextString.find(L"BambuStudio") != std::wstring::npos && classNameString == L"wxWindowNR") {
|
||||||
//check if other instances has same instance hash
|
//check if other instances has same instance hash
|
||||||
//if not it is not same version(binary) as this version
|
//if not it is not same version(binary) as this version
|
||||||
HANDLE handle = GetProp(hwnd, L"Instance_Hash_Minor");
|
HANDLE handle = GetProp(hwnd, L"Instance_Hash_Minor");
|
||||||
uint64_t other_instance_hash = PtrToUint(handle);
|
uint64_t other_instance_hash = PtrToUint(handle);
|
||||||
uint64_t other_instance_hash_major;
|
uint64_t other_instance_hash_major;
|
||||||
|
@ -145,12 +145,12 @@ namespace instance_check_internal
|
||||||
data_to_send.cbData = sizeof(TCHAR) * (wcslen(*command_line_args.get()) + 1);
|
data_to_send.cbData = sizeof(TCHAR) * (wcslen(*command_line_args.get()) + 1);
|
||||||
data_to_send.lpData = *command_line_args.get();
|
data_to_send.lpData = *command_line_args.get();
|
||||||
SendMessage(l_bambu_studio_hwnd, WM_COPYDATA, 0, (LPARAM)&data_to_send);
|
SendMessage(l_bambu_studio_hwnd, WM_COPYDATA, 0, (LPARAM)&data_to_send);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static bool get_lock(const std::string& name, const std::string& path)
|
static bool get_lock(const std::string& name, const std::string& path)
|
||||||
{
|
{
|
||||||
|
@ -200,7 +200,7 @@ namespace instance_check_internal
|
||||||
// BOOST_LOG_TRIVIAL(error) << "success delete lockfile " << path;
|
// BOOST_LOG_TRIVIAL(error) << "success delete lockfile " << path;
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
send_message_mac_closing(GUI::wxGetApp().get_instance_hash_string(),GUI::wxGetApp().get_instance_hash_string());
|
send_message_mac_closing(GUI::wxGetApp().get_instance_hash_string(),GUI::wxGetApp().get_instance_hash_string());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ namespace instance_check_internal
|
||||||
{
|
{
|
||||||
//std::string v(version);
|
//std::string v(version);
|
||||||
//std::replace(v.begin(), v.end(), '.', '-');
|
//std::replace(v.begin(), v.end(), '.', '-');
|
||||||
//if (!instance_check_internal::get_lock(v))
|
//if (!instance_check_internal::get_lock(v))
|
||||||
{
|
{
|
||||||
send_message_mac(message_text, version);
|
send_message_mac(message_text, version);
|
||||||
return true;
|
return true;
|
||||||
|
@ -236,7 +236,7 @@ namespace instance_check_internal
|
||||||
dbus_uint32_t serial = 0;
|
dbus_uint32_t serial = 0;
|
||||||
const char* sigval = message_text.c_str();
|
const char* sigval = message_text.c_str();
|
||||||
//std::string interface_name = "com.prusa3d.prusaslicer.InstanceCheck";
|
//std::string interface_name = "com.prusa3d.prusaslicer.InstanceCheck";
|
||||||
std::string interface_name = "com.bbl.bambuslicer.InstanceCheck.Object" + version;
|
std::string interface_name = "com.bambulab.BambuStudio.InstanceCheck.Object" + version;
|
||||||
std::string method_name = "AnotherInstance";
|
std::string method_name = "AnotherInstance";
|
||||||
//std::string object_name = "/com/prusa3d/prusaslicer/InstanceCheck";
|
//std::string object_name = "/com/prusa3d/prusaslicer/InstanceCheck";
|
||||||
std::string object_name = "/com/BambuLab/BambuStudio/InstanceCheck/Object" + version;
|
std::string object_name = "/com/BambuLab/BambuStudio/InstanceCheck/Object" + version;
|
||||||
|
@ -290,7 +290,7 @@ namespace instance_check_internal
|
||||||
BOOST_LOG_TRIVIAL(trace) << "DBus message sent.";
|
BOOST_LOG_TRIVIAL(trace) << "DBus message sent.";
|
||||||
|
|
||||||
// free the message and close the connection
|
// free the message and close the connection
|
||||||
dbus_message_unref(msg);
|
dbus_message_unref(msg);
|
||||||
dbus_connection_unref(conn);
|
dbus_connection_unref(conn);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -319,7 +319,7 @@ bool instance_check(int argc, char** argv, bool app_config_single_instance)
|
||||||
hashed_path = std::hash<std::string>{}(appimage_path.string());
|
hashed_path = std::hash<std::string>{}(appimage_path.string());
|
||||||
appimage_env_valid = true;
|
appimage_env_valid = true;
|
||||||
}
|
}
|
||||||
} catch (std::exception &) {
|
} catch (std::exception &) {
|
||||||
}
|
}
|
||||||
if (! appimage_env_valid)
|
if (! appimage_env_valid)
|
||||||
BOOST_LOG_TRIVIAL(error) << "APPIMAGE environment variable was set, but it does not point to a valid file: " << appimage_env;
|
BOOST_LOG_TRIVIAL(error) << "APPIMAGE environment variable was set, but it does not point to a valid file: " << appimage_env;
|
||||||
|
@ -352,7 +352,7 @@ bool instance_check(int argc, char** argv, bool app_config_single_instance)
|
||||||
if (instance_check_internal::get_lock(lock_name + ".lock", data_dir() + "/cache/") && *cla.should_send) {
|
if (instance_check_internal::get_lock(lock_name + ".lock", data_dir() + "/cache/") && *cla.should_send) {
|
||||||
#endif
|
#endif
|
||||||
instance_check_internal::send_message(cla.cl_string, lock_name);
|
instance_check_internal::send_message(cla.cl_string, lock_name);
|
||||||
BOOST_LOG_TRIVIAL(error) << "Instance check: Another instance found. This instance will terminate. Lock file of current running instance is located at " << data_dir() <<
|
BOOST_LOG_TRIVIAL(error) << "Instance check: Another instance found. This instance will terminate. Lock file of current running instance is located at " << data_dir() <<
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
"\\cache\\"
|
"\\cache\\"
|
||||||
#else // mac & linx
|
#else // mac & linx
|
||||||
|
@ -362,7 +362,7 @@ bool instance_check(int argc, char** argv, bool app_config_single_instance)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
BOOST_LOG_TRIVIAL(info) << "Instance check: Another instance not found or single-instance not set.";
|
BOOST_LOG_TRIVIAL(info) << "Instance check: Another instance not found or single-instance not set.";
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,7 +376,7 @@ void OtherInstanceMessageHandler::init(wxEvtHandler* callback_evt_handler)
|
||||||
{
|
{
|
||||||
assert(!m_initialized);
|
assert(!m_initialized);
|
||||||
assert(m_callback_evt_handler == nullptr);
|
assert(m_callback_evt_handler == nullptr);
|
||||||
if (m_initialized)
|
if (m_initialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_initialized = true;
|
m_initialized = true;
|
||||||
|
@ -426,7 +426,7 @@ void OtherInstanceMessageHandler::shutdown(MainFrame* main_frame)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
void OtherInstanceMessageHandler::init_windows_properties(MainFrame* main_frame, size_t instance_hash)
|
void OtherInstanceMessageHandler::init_windows_properties(MainFrame* main_frame, size_t instance_hash)
|
||||||
{
|
{
|
||||||
size_t minor_hash = instance_hash & 0xFFFFFFFF;
|
size_t minor_hash = instance_hash & 0xFFFFFFFF;
|
||||||
|
@ -485,7 +485,7 @@ namespace MessageHandlerInternal
|
||||||
}
|
}
|
||||||
} //namespace MessageHandlerInternal
|
} //namespace MessageHandlerInternal
|
||||||
|
|
||||||
void OtherInstanceMessageHandler::handle_message(const std::string& message)
|
void OtherInstanceMessageHandler::handle_message(const std::string& message)
|
||||||
{
|
{
|
||||||
BOOST_LOG_TRIVIAL(info) << "message from other instance: " << message;
|
BOOST_LOG_TRIVIAL(info) << "message from other instance: " << message;
|
||||||
|
|
||||||
|
@ -514,7 +514,7 @@ void OtherInstanceMessageHandler::handle_message(const std::string& message)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
void OtherInstanceMessageHandler::handle_message_other_closed()
|
void OtherInstanceMessageHandler::handle_message_other_closed()
|
||||||
{
|
{
|
||||||
instance_check_internal::get_lock(wxGetApp().get_instance_hash_string() + ".lock", data_dir() + "/cache/");
|
instance_check_internal::get_lock(wxGetApp().get_instance_hash_string() + ".lock", data_dir() + "/cache/");
|
||||||
}
|
}
|
||||||
|
@ -525,7 +525,7 @@ void OtherInstanceMessageHandler::handle_message_other_closed()
|
||||||
namespace MessageHandlerDBusInternal
|
namespace MessageHandlerDBusInternal
|
||||||
{
|
{
|
||||||
//reply to introspect makes our DBus object visible for other programs like D-Feet
|
//reply to introspect makes our DBus object visible for other programs like D-Feet
|
||||||
static void respond_to_introspect(DBusConnection *connection, DBusMessage *request)
|
static void respond_to_introspect(DBusConnection *connection, DBusMessage *request)
|
||||||
{
|
{
|
||||||
DBusMessage *reply;
|
DBusMessage *reply;
|
||||||
const char *introspection_data =
|
const char *introspection_data =
|
||||||
|
@ -538,19 +538,19 @@ namespace MessageHandlerDBusInternal
|
||||||
" <arg name=\"data\" direction=\"out\" type=\"s\" />"
|
" <arg name=\"data\" direction=\"out\" type=\"s\" />"
|
||||||
" </method>"
|
" </method>"
|
||||||
" </interface>"
|
" </interface>"
|
||||||
" <interface name=\"com.bbl.bambuslicer.InstanceCheck\">"
|
" <interface name=\"com.bambulab.BambuStudio.InstanceCheck\">"
|
||||||
" <method name=\"AnotherInstance\">"
|
" <method name=\"AnotherInstance\">"
|
||||||
" <arg name=\"data\" direction=\"in\" type=\"s\" />"
|
" <arg name=\"data\" direction=\"in\" type=\"s\" />"
|
||||||
" </method>"
|
" </method>"
|
||||||
" </interface>"
|
" </interface>"
|
||||||
" </node>";
|
" </node>";
|
||||||
|
|
||||||
reply = dbus_message_new_method_return(request);
|
reply = dbus_message_new_method_return(request);
|
||||||
dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection_data, DBUS_TYPE_INVALID);
|
dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection_data, DBUS_TYPE_INVALID);
|
||||||
dbus_connection_send(connection, reply, NULL);
|
dbus_connection_send(connection, reply, NULL);
|
||||||
dbus_message_unref(reply);
|
dbus_message_unref(reply);
|
||||||
}
|
}
|
||||||
//method AnotherInstance receives message from another BambuStudio instance
|
//method AnotherInstance receives message from another BambuStudio instance
|
||||||
static void handle_method_another_instance(DBusConnection *connection, DBusMessage *request)
|
static void handle_method_another_instance(DBusConnection *connection, DBusMessage *request)
|
||||||
{
|
{
|
||||||
DBusError err;
|
DBusError err;
|
||||||
|
@ -578,13 +578,13 @@ namespace MessageHandlerDBusInternal
|
||||||
const char* member_name = dbus_message_get_member(message);
|
const char* member_name = dbus_message_get_member(message);
|
||||||
std::string our_interface = "com.BambuLab.BambuStudio.InstanceCheck.Object" + wxGetApp().get_instance_hash_string();
|
std::string our_interface = "com.BambuLab.BambuStudio.InstanceCheck.Object" + wxGetApp().get_instance_hash_string();
|
||||||
BOOST_LOG_TRIVIAL(trace) << "DBus message received: interface: " << interface_name << ", member: " << member_name;
|
BOOST_LOG_TRIVIAL(trace) << "DBus message received: interface: " << interface_name << ", member: " << member_name;
|
||||||
if (0 == strcmp("org.freedesktop.DBus.Introspectable", interface_name) && 0 == strcmp("Introspect", member_name)) {
|
if (0 == strcmp("org.freedesktop.DBus.Introspectable", interface_name) && 0 == strcmp("Introspect", member_name)) {
|
||||||
respond_to_introspect(connection, message);
|
respond_to_introspect(connection, message);
|
||||||
return DBUS_HANDLER_RESULT_HANDLED;
|
return DBUS_HANDLER_RESULT_HANDLED;
|
||||||
} else if (0 == strcmp(our_interface.c_str(), interface_name) && 0 == strcmp("AnotherInstance", member_name)) {
|
} else if (0 == strcmp(our_interface.c_str(), interface_name) && 0 == strcmp("AnotherInstance", member_name)) {
|
||||||
handle_method_another_instance(connection, message);
|
handle_method_another_instance(connection, message);
|
||||||
return DBUS_HANDLER_RESULT_HANDLED;
|
return DBUS_HANDLER_RESULT_HANDLED;
|
||||||
}
|
}
|
||||||
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
||||||
}
|
}
|
||||||
} //namespace MessageHandlerDBusInternal
|
} //namespace MessageHandlerDBusInternal
|
||||||
|
@ -604,13 +604,13 @@ void OtherInstanceMessageHandler::listen()
|
||||||
|
|
||||||
// connect to the bus and check for errors (use SESSION bus everywhere!)
|
// connect to the bus and check for errors (use SESSION bus everywhere!)
|
||||||
conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
|
conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
|
||||||
if (dbus_error_is_set(&err)) {
|
if (dbus_error_is_set(&err)) {
|
||||||
BOOST_LOG_TRIVIAL(error) << "DBus Connection Error: "<< err.message;
|
BOOST_LOG_TRIVIAL(error) << "DBus Connection Error: "<< err.message;
|
||||||
BOOST_LOG_TRIVIAL(error) << "Dbus Messages listening terminating.";
|
BOOST_LOG_TRIVIAL(error) << "Dbus Messages listening terminating.";
|
||||||
dbus_error_free(&err);
|
dbus_error_free(&err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (NULL == conn) {
|
if (NULL == conn) {
|
||||||
BOOST_LOG_TRIVIAL(error) << "DBus Connection is NULL. Dbus Messages listening terminating.";
|
BOOST_LOG_TRIVIAL(error) << "DBus Connection is NULL. Dbus Messages listening terminating.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -618,9 +618,9 @@ void OtherInstanceMessageHandler::listen()
|
||||||
// request our name on the bus and check for errors
|
// request our name on the bus and check for errors
|
||||||
name_req_val = dbus_bus_request_name(conn, interface_name.c_str(), DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
|
name_req_val = dbus_bus_request_name(conn, interface_name.c_str(), DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
|
||||||
if (dbus_error_is_set(&err)) {
|
if (dbus_error_is_set(&err)) {
|
||||||
BOOST_LOG_TRIVIAL(error) << "DBus Request name Error: "<< err.message;
|
BOOST_LOG_TRIVIAL(error) << "DBus Request name Error: "<< err.message;
|
||||||
BOOST_LOG_TRIVIAL(error) << "Dbus Messages listening terminating.";
|
BOOST_LOG_TRIVIAL(error) << "Dbus Messages listening terminating.";
|
||||||
dbus_error_free(&err);
|
dbus_error_free(&err);
|
||||||
dbus_connection_unref(conn);
|
dbus_connection_unref(conn);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -638,7 +638,7 @@ void OtherInstanceMessageHandler::listen()
|
||||||
// register new object - this is our access to DBus
|
// register new object - this is our access to DBus
|
||||||
dbus_connection_try_register_object_path(conn, object_name.c_str(), &vtable, NULL, &err);
|
dbus_connection_try_register_object_path(conn, object_name.c_str(), &vtable, NULL, &err);
|
||||||
if ( dbus_error_is_set(&err) ) {
|
if ( dbus_error_is_set(&err) ) {
|
||||||
BOOST_LOG_TRIVIAL(error) << "DBus Register object Error: "<< err.message;
|
BOOST_LOG_TRIVIAL(error) << "DBus Register object Error: "<< err.message;
|
||||||
BOOST_LOG_TRIVIAL(error) << "Dbus Messages listening terminating.";
|
BOOST_LOG_TRIVIAL(error) << "Dbus Messages listening terminating.";
|
||||||
dbus_connection_unref(conn);
|
dbus_connection_unref(conn);
|
||||||
dbus_error_free(&err);
|
dbus_error_free(&err);
|
||||||
|
@ -648,7 +648,7 @@ void OtherInstanceMessageHandler::listen()
|
||||||
BOOST_LOG_TRIVIAL(trace) << "Dbus object "<< object_name <<" registered. Starting listening for messages.";
|
BOOST_LOG_TRIVIAL(trace) << "Dbus object "<< object_name <<" registered. Starting listening for messages.";
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
// Wait for 1 second
|
// Wait for 1 second
|
||||||
// Cancellable.
|
// Cancellable.
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lck(m_thread_stop_mutex);
|
std::unique_lock<std::mutex> lck(m_thread_stop_mutex);
|
||||||
|
@ -663,7 +663,7 @@ void OtherInstanceMessageHandler::listen()
|
||||||
//that is handled here with our own event loop above
|
//that is handled here with our own event loop above
|
||||||
dbus_connection_read_write_dispatch(conn, 0);
|
dbus_connection_read_write_dispatch(conn, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
dbus_connection_unref(conn);
|
dbus_connection_unref(conn);
|
||||||
}
|
}
|
||||||
#endif //BACKGROUND_MESSAGE_LISTENER
|
#endif //BACKGROUND_MESSAGE_LISTENER
|
||||||
|
|
Loading…
Reference in New Issue