hostversion.cpp revision 3f69769f2d22bf0277c2d17c8e7d10b147f5823f
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff * X11 guest client - host version check.
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff * Copyright (C) 2011-2012 Oracle Corporation
189003a5b9ed3b1168f3331a2d4213bb08bf0d86Jeff Conniff * This file is part of VirtualBox Open Source Edition (OSE), as
2aa0883432cf56a974eb9261afcf6ede4313384cJeff Conniff * available from http://www.virtualbox.org. This file is free software;
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff * you can redistribute it and/or modify it under the terms of the GNU
2aa0883432cf56a974eb9261afcf6ede4313384cJeff Conniff * General Public License (GPL) as published by the Free Software
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff * Foundation, in version 2 as it comes in the "COPYING" file of the
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniffstatic const char *getPidFilePath()
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff return ".vboxclient-hostversion.pid";
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniffstatic int showNotify(const char *pcHeader, const char *pcBody)
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff LogRelFlowFunc(("Could not retrieve D-BUS session bus!\n"));
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff msg = dbus_message_new_method_call("org.freedesktop.Notifications",
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff "org.freedesktop.Notifications",
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff int32_t msg_timeout = -1; /* Let the notification server decide */
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff /* Format: UINT32 org.freedesktop.Notifications.Notify
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff * (STRING app_name, UINT32 replaces_id, STRING app_icon, STRING summary, STRING body,
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff * ARRAY actions, DICT hints, INT32 expire_timeout)
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff dbus_message_iter_append_basic(&iter,DBUS_TYPE_STRING,&msg_app);
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff dbus_message_iter_append_basic(&iter,DBUS_TYPE_UINT32,&msg_replace_id);
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff dbus_message_iter_append_basic(&iter,DBUS_TYPE_STRING,&msg_icon);
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff dbus_message_iter_append_basic(&iter,DBUS_TYPE_STRING,&msg_summary);
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff dbus_message_iter_append_basic(&iter,DBUS_TYPE_STRING,&msg_body);
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff dbus_message_iter_open_container(&iter,DBUS_TYPE_ARRAY,DBUS_TYPE_STRING_AS_STRING,&array);
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff dbus_message_iter_close_container(&iter,&array);
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff dbus_message_iter_open_container(&iter,DBUS_TYPE_ARRAY,"{sv}",&array);
691af6c84a00ad5f629ffcfa3b1e42c38da5da4fJeff Conniff dbus_message_iter_close_container(&iter,&array);
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff dbus_message_iter_append_basic(&iter,DBUS_TYPE_INT32,&msg_timeout);
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff reply = dbus_connection_send_with_reply_and_block(conn, msg,
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff LogRel(("D-BUS returned an error while sending the notification: %s", err.message));
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff /* TODO: Implement me */
691af6c84a00ad5f629ffcfa3b1e42c38da5da4fJeff Conniff# endif /* VBOX_WITH_DBUS */
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff/** @todo Move this part in VbglR3 and just provide a callback for the platform-specific
691af6c84a00ad5f629ffcfa3b1e42c38da5da4fJeff Conniff notification stuff, since this is very similar to the VBoxTray code. */
7928e2ef0532df9064d9374ceda31d6ab080eb2dJeff Conniffstatic int run(struct VBCLSERVICE **ppInterface, bool fDaemonised)
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff /* Because we need desktop notifications to be displayed, wait
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff * some time to make the desktop environment load (as a work around). */
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff RTThreadSleep(30 * 1000 /* Wait 30 seconds */);
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff LogRel(("VBoxClient: D-Bus seems not to be installed; no host version check/notification done.\n"));
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff# endif /* VBOX_WITH_DBUS */
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff rc = VbglR3GuestPropConnect(&uGuestPropSvcClientID);
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff LogRel(("VBoxClient: Cannot connect to guest property service while chcking for host version! rc = %Rrc\n", rc));
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff rc = VbglR3HostVersionCheckForUpdate(uGuestPropSvcClientID, &bUpdate, &pszHostVersion, &pszGuestVersion);
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff /** @todo add some translation macros here */
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff RTStrPrintf(szTitle, sizeof(szTitle), "VirtualBox Guest Additions update available!");
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff RTStrPrintf(szMsg, sizeof(szMsg), "Your guest is currently running the Guest Additions version %s. "
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff "We recommend updating to the latest version (%s) by choosing the "
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff "install option from the Devices menu.", pszGuestVersion, pszHostVersion);
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff/* This is the message which appears for non-Oracle builds of the
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff* Guest Additions. Distributors are encouraged to customise this. */
7928e2ef0532df9064d9374ceda31d6ab080eb2dJeff Conniff RTStrPrintf(szMsg, sizeof(szMsg), "Your virtual machine is currently running the Guest Additions version %s. Since you are running a version of the Guest Additions provided by the operating system you installed in the virtual machine we recommend that you update it to at least version %s using that system's update features, or alternatively that you remove this version and then install the " VBOX_VENDOR_SHORT " Guest Additions package using the install option from the Devices menu. Please consult the documentation for the operating system you are running to find out how to update or remove the current Guest Additions package.", pszGuestVersion, pszHostVersion);
736745cee753d967cf5fb1063c21578ecca61b4aJeff Conniff LogRel(("VBoxClient: VirtualBox Guest Additions update available!"));
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff LogRel(("VBoxClient: Could not show version notifier tooltip! rc = %d\n", rc));
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff /* Store host version to not notify again */
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff rc = VbglR3HostVersionLastCheckedStore(uGuestPropSvcClientID, pszHostVersion);
44c68f247b9311ea767cb4656220793317e3383bJeff Conniff VbglR3GuestPropDisconnect(uGuestPropSvcClientID);
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff# endif /* VBOX_WITH_GUEST_PROPS */
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniff/* Static factory */
91f1deca7427bc48d15c263856f567a6bab97394Jeff Conniffstruct VBCLSERVICE **VBClGetHostVersionService()
7928e2ef0532df9064d9374ceda31d6ab080eb2dJeff Conniff (struct HOSTVERSIONSERVICE *)RTMemAlloc(sizeof(*pService));