1
/*********************************************************
2
* Copyright (C) 2010 VMware, Inc. All rights reserved.
4
* This program is free software; you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License as published
6
* by the Free Software Foundation version 2.1 and no later version.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
10
* or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public
11
* License for more details.
13
* You should have received a copy of the GNU Lesser General Public License
14
* along with this program; if not, write to the Free Software Foundation, Inc.,
15
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17
*********************************************************/
22
* Implements an object that provides the entry points for tools unity
26
#include "vmware/tools/plugin.h"
33
#include "guestrpc/unity.h"
34
#include "guestrpc/unityActive.h"
37
#if defined(OPEN_VM_TOOLS)
38
#include "unitylib/unity.h"
41
#endif // OPEN_VM_TOOLS
45
#include "ghIntegration.h"
47
#include "unityPlugin.h"
48
#include "unityTclo.h"
49
#if defined(G_PLATFORM_WIN32)
50
#include "NotifyIconRpcCallback.h"
51
#endif // G_PLATFORM_WIN32
53
#define UNITY_CAP_NAME "unity"
55
namespace vmware { namespace tools {
58
* The static instance of the notification icon RPC callback object. This object
59
* sends an RPC to the VMX in response to any change to the set of notification
62
#if defined(G_PLATFORM_WIN32)
63
static NotifyIconRpcCallback gNotifyIconCallback;
64
#endif // G_PLATFORM_WIN32
68
*-----------------------------------------------------------------------------
70
* UnityPlugin::UnityPlugin --
72
* Constructor for the Unity plugin, initialized Unity, and common options
81
*-----------------------------------------------------------------------------
84
UnityPlugin::UnityPlugin(const ToolsAppCtx* ctx) // IN: The app context.
86
mUnityUpdateChannel(NULL)
92
*-----------------------------------------------------------------------------
94
* UnityPlugin::Initialize --
96
* Initializer for the Unity plugin, initialized Unity, and common options
100
* True if initializatino was successful.
105
*-----------------------------------------------------------------------------
109
UnityPlugin::Initialize()
111
UnityHostCallbacks unityHostCallbacks;
112
memset(&unityHostCallbacks, 0, sizeof unityHostCallbacks);
113
unityHostCallbacks.buildUpdateCB = &UnityBuildUpdates;
114
unityHostCallbacks.updateCB = &UnityUpdateCallbackFn;
115
unityHostCallbacks.sendWindowContents = &UnitySendWindowContents;
116
unityHostCallbacks.sendRequestMinimizeOperation = &UnitySendRequestMinimizeOperation;
117
unityHostCallbacks.shouldShowTaskbar = &UnityShouldShowTaskbar;
121
* Initialize the update channel.
123
mUnityUpdateChannel = UnityUpdateChannelInit();
124
if (NULL == mUnityUpdateChannel) {
125
Warning("%s: Unable to initialize Unity update channel.\n", __FUNCTION__);
128
unityHostCallbacks.updateCbCtx = mUnityUpdateChannel;
130
Unity_Init(unityHostCallbacks, mCtx->serviceObj);
133
GHIHostCallbacks ghiHostCallbacks;
134
memset(&ghiHostCallbacks, 0, sizeof ghiHostCallbacks);
135
ghiHostCallbacks.launchMenuChange = &GHILaunchMenuChangeRPC;
137
#if defined(G_PLATFORM_WIN32)
138
GHI_Init(mCtx->mainLoop, NULL, ghiHostCallbacks);
139
GHI_RegisterNotifyIconCallback(&gNotifyIconCallback);
141
GHI_Init(mCtx->mainLoop, mCtx->envp, ghiHostCallbacks);
142
#endif // G_PLATFORM_WIN32
144
if (g_key_file_get_boolean(mCtx->config, CONFGROUPNAME_UNITY,
145
CONFNAME_UNITY_ENABLEDEBUG, NULL)) {
146
Unity_InitializeDebugger();
148
Unity_SetForceEnable(g_key_file_get_boolean(mCtx->config, CONFGROUPNAME_UNITY,
149
CONFNAME_UNITY_FORCEENABLE, NULL));
152
* If no preferred color is in the config file then use a light gray tone,
153
* the value is stored as xBGR.
155
int desktopColor = 0;
157
desktopColor = g_key_file_get_integer(mCtx->config, CONFGROUPNAME_UNITY,
158
CONFNAME_UNITY_BACKGROUNDCOLOR, &e);
160
desktopColor = /* red */ 0xdc |
161
/* green */ 0xdc << 8 |
162
/* blue */ 0xdc << 16;
164
Unity_SetConfigDesktopColor(desktopColor);
170
*-----------------------------------------------------------------------------
172
* UnityPlugin::~UnityPlugin --
174
* Destructor for the Unity plugin, cleanup Unity.
182
*-----------------------------------------------------------------------------
185
UnityPlugin::~UnityPlugin()
188
UnityUpdateChannelCleanup(mUnityUpdateChannel);
190
#if defined(G_PLATFORM_WIN32)
191
GHI_UnregisterNotifyIconCallback(&gNotifyIconCallback);
192
#endif // G_PLATFORM_WIN32
199
*-----------------------------------------------------------------------------
201
* UnityPlugin::GetCapabilities --
203
* Called by the service core when the host requests the capabilities
204
* supported by the guest tools.
207
* A list of capabilities to be sent to the host.
212
*-----------------------------------------------------------------------------
215
std::vector<ToolsAppCapability>
216
UnityPlugin::GetCapabilities(gboolean set) // IN
219
* Note that we can't use UNITY_RPC_UNITY_CAP here because it includes the
220
* "tools.capability" prefix which vmtoolsd will automatically prepend to the
221
* supplied capability name.
223
Bool b = set ? Unity_IsSupported() : FALSE;
224
std::vector<ToolsAppCapability> caps;
225
caps.push_back(ToolsAppCapabilityOldEntry(UNITY_CAP_NAME, b));
226
caps.push_back(ToolsAppCapabilityOldEntry("unity.taskbar", b));
227
caps.push_back(ToolsAppCapabilityNewEntry(UNITY_CAP_STATUS_UNITY_ACTIVE, b));
233
*-----------------------------------------------------------------------------
235
* UnityPlugin::GetRpcCallbackList --
237
* Called by the service core when the host requests the RPCs supported
238
* by the guest tools.
241
* A list of RPC Callbacks to be sent to the host.
246
*-----------------------------------------------------------------------------
249
std::vector<RpcChannelCallback>
250
UnityPlugin::GetRpcCallbackList()
252
std::vector<RpcChannelCallback> rpcList;
254
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_ENTER, UnityTcloEnter));
255
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_GET_UPDATE_FULL, UnityTcloGetUpdate));
256
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_GET_UPDATE_INCREMENTAL, UnityTcloGetUpdate));
257
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_GET_WINDOW_PATH, UnityTcloGetWindowPath));
258
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_WINDOW_SETTOP, UnityTcloSetTopWindowGroup));
259
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_GET_WINDOW_CONTENTS, UnityTcloGetWindowContents));
260
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_GET_ICON_DATA, UnityTcloGetIconData));
261
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_DESKTOP_WORK_AREA_SET, UnityTcloSetDesktopWorkArea));
262
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_SHOW_TASKBAR, UnityTcloShowTaskbar));
263
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_EXIT, UnityTcloExit));
264
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_WINDOW_MOVE_RESIZE, UnityTcloMoveResizeWindow));
265
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_DESKTOP_CONFIG_SET, UnityTcloSetDesktopConfig));
266
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_DESKTOP_ACTIVE_SET, UnityTcloSetDesktopActive));
267
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_WINDOW_DESKTOP_SET, UnityTcloSetWindowDesktop));
268
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_CONFIRM_OPERATION, UnityTcloConfirmOperation));
269
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_SET_OPTIONS, UnityTcloSetUnityOptions));
270
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_WINDOW_CONTENTS_REQUEST, UnityTcloRequestWindowContents));
271
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_SEND_MOUSE_WHEEL, UnityTcloSendMouseWheel));
273
char **commandList = NULL;
274
Unity_GetWindowCommandList(&commandList);
275
for (int i = 0; commandList && (NULL != commandList[i]); i++) {
276
rpcList.push_back(RpcChannelCallbackEntry(commandList[i], UnityTcloWindowCommand));
279
if (GHI_IsSupported()) {
280
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_GET_BINARY_INFO, GHITcloGetBinaryInfo));
281
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_OPEN_LAUNCHMENU, GHITcloOpenStartMenu));
282
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_GET_LAUNCHMENU_ITEM, GHITcloGetStartMenuItem));
283
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_CLOSE_LAUNCHMENU, GHITcloCloseStartMenu));
284
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_SHELL_OPEN, GHITcloShellOpen));
285
rpcList.push_back(RpcChannelCallbackEntry(GHI_RPC_GUEST_SHELL_ACTION, GHITcloShellAction));
286
rpcList.push_back(RpcChannelCallbackEntry(UNITY_RPC_GET_BINARY_HANDLERS, GHITcloGetBinaryHandlers));
287
rpcList.push_back(RpcChannelCallbackEntry(GHI_RPC_SET_GUEST_HANDLER, GHITcloSetGuestHandler));
288
rpcList.push_back(RpcChannelCallbackEntry(GHI_RPC_RESTORE_DEFAULT_GUEST_HANDLER, GHITcloRestoreDefaultGuestHandler));
289
rpcList.push_back(RpcChannelCallbackEntry(GHI_RPC_OUTLOOK_SET_TEMP_FOLDER, GHITcloSetOutlookTempFolder));
290
rpcList.push_back(RpcChannelCallbackEntry(GHI_RPC_OUTLOOK_RESTORE_TEMP_FOLDER, GHITcloRestoreOutlookTempFolder));
291
rpcList.push_back(RpcChannelCallbackEntry(GHI_RPC_TRAY_ICON_SEND_EVENT, GHITcloTrayIconSendEvent));
292
rpcList.push_back(RpcChannelCallbackEntry(GHI_RPC_TRAY_ICON_START_UPDATES, GHITcloTrayIconStartUpdates));
293
rpcList.push_back(RpcChannelCallbackEntry(GHI_RPC_TRAY_ICON_STOP_UPDATES, GHITcloTrayIconStopUpdates));
294
rpcList.push_back(RpcChannelCallbackEntry(GHI_RPC_SET_FOCUSED_WINDOW, GHITcloSetFocusedWindow));
295
rpcList.push_back(RpcChannelCallbackEntry(GHI_RPC_GET_EXEC_INFO_HASH, GHITcloGetExecInfoHash));
301
} /* namespace tools */ } /* namespace vmware */