00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef _VMWARE_TOOLS_PLUGIN_H_
00020 #define _VMWARE_TOOLS_PLUGIN_H_
00021
00032 #include <glib.h>
00033 #if defined(G_PLATFORM_WIN32)
00034 # include <windows.h>
00035 # include <objbase.h>
00036 #endif
00037 #include "vmware/guestrpc/capabilities.h"
00038 #include "vmware/tools/guestrpc.h"
00039 #include "vmware/tools/utils.h"
00040
00049 #define VMTOOLSAPP_ERROR(ctx, err) do { \
00050 ASSERT((err) != 0); \
00051 (ctx)->errorCode = (err); \
00052 g_main_loop_quit((ctx)->mainLoop); \
00053 } while (0)
00054
00055
00065 #define VMTOOLSAPP_ATTACH_SOURCE(ctx, src, cb, data, destroy) do { \
00066 GSource *__src = (src); \
00067 g_source_set_callback(__src, (GSourceFunc) (cb), (data), (destroy)); \
00068 g_source_attach(__src, g_main_loop_get_context((ctx)->mainLoop)); \
00069 } while (0)
00070
00075 #define TOOLS_IS_MAIN_SERVICE(ctx) (strcmp((ctx)->name, \
00076 VMTOOLS_GUEST_SERVICE) == 0)
00077
00082 #define TOOLS_IS_USER_SERVICE(ctx) (strcmp((ctx)->name, \
00083 VMTOOLS_USER_SERVICE) == 0)
00084
00085
00086 #define TOOLS_STATE_LOG_ROOT 0
00087 #define TOOLS_STATE_LOG_CONTAINER 1
00088 #define TOOLS_STATE_LOG_PLUGIN 2
00089
00100 static inline void
00101 ToolsCore_LogState(guint level,
00102 const char *fmt,
00103 ...)
00104 {
00105 gchar *indented = g_strdup_printf("%*s%s", 3 * level, "", fmt);
00106
00107 va_list args;
00108 va_start(args, fmt);
00109 g_logv("state", G_LOG_LEVEL_INFO, indented, args);
00110 va_end(args);
00111
00112 g_free(indented);
00113 }
00114
00115
00127 #define TOOLS_CORE_SIG_CAPABILITIES "tcs_capabilities"
00128
00136 #define TOOLS_CORE_SIG_CONF_RELOAD "tcs_conf_reload"
00137
00147 #define TOOLS_CORE_SIG_DUMP_STATE "tcs_dump_state"
00148
00156 #define TOOLS_CORE_SIG_RESET "tcs_reset"
00157
00170 #define TOOLS_CORE_SIG_SET_OPTION "tcs_set_option"
00171
00179 #define TOOLS_CORE_SIG_SHUTDOWN "tcs_shutdown"
00180
00181 #if defined(G_PLATFORM_WIN32)
00182
00209 #define TOOLS_CORE_SIG_SERVICE_CONTROL "tcs_service_control"
00210
00211 #endif
00212
00220 #define TOOLS_CORE_PROP_CTX "tcs_app_ctx"
00221
00222
00232 typedef enum {
00233 TOOLS_CORE_API_V1 = 0x1,
00234 } ToolsCoreAPI;
00235
00236
00241 typedef struct ToolsAppCtx {
00243 ToolsCoreAPI version;
00245 const gchar *name;
00247 gboolean isVMware;
00249 int errorCode;
00251 GMainLoop *mainLoop;
00253 RpcChannel *rpc;
00255 GKeyFile *config;
00256 #if defined(G_PLATFORM_WIN32)
00257
00258 gboolean comInitialized;
00259 #else
00260
00261 int blockFD;
00263 const char **envp;
00264 #endif
00265
00271 gpointer serviceObj;
00272 } ToolsAppCtx;
00273
00274 #if defined(G_PLATFORM_WIN32)
00275
00282 G_INLINE_FUNC gboolean
00283 ToolsCore_InitializeCOM(ToolsAppCtx *ctx)
00284 {
00285 if (!ctx->comInitialized) {
00286 HRESULT ret = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
00287 ctx->comInitialized = SUCCEEDED(ret);
00288 if (!ctx->comInitialized) {
00289 g_log(ctx->name, G_LOG_LEVEL_WARNING,
00290 "COM initialization failed(0x%x)\n", ret);
00291 }
00292 }
00293 return ctx->comInitialized;
00294 }
00295 #endif
00296
00297
00298
00299
00301 typedef enum {
00302 TOOLS_CAP_OLD = 0,
00303 TOOLS_CAP_OLD_NOVAL = 1,
00304 TOOLS_CAP_NEW = 2
00305 } ToolsCapabilityType;
00306
00316 typedef struct ToolsAppCapability {
00318 ToolsCapabilityType type;
00323 const gchar *name;
00328 GuestCapabilities index;
00330 guint value;
00331 } ToolsAppCapability;
00332
00333
00334
00335
00337 typedef enum {
00341 TOOLS_APP_GUESTRPC = 1,
00346 TOOLS_APP_SIGNALS = 2,
00352 TOOLS_APP_PROVIDER = 3,
00357 TOOLS_SVC_PROPERTY = 4,
00358 } ToolsAppType;
00359
00360
00361 struct ToolsPluginData;
00362
00371 typedef struct ToolsAppProvider {
00373 const gchar *name;
00380 ToolsAppType regType;
00382 size_t regSize;
00392 void (*activate)(ToolsAppCtx *ctx, struct ToolsAppProvider *prov, GError **err);
00404 gboolean (*registerApp)(ToolsAppCtx *ctx,
00405 struct ToolsAppProvider *prov,
00406 struct ToolsPluginData *plugin,
00407 gpointer reg);
00418 void (*shutdown)(ToolsAppCtx *ctx, struct ToolsAppProvider *prov);
00431 void (*dumpState)(ToolsAppCtx *ctx, struct ToolsAppProvider *prov, gpointer reg);
00432 } ToolsAppProvider;
00433
00434
00445 typedef struct ToolsAppReg {
00446 ToolsAppType type;
00447 GArray *data;
00448 } ToolsAppReg;
00449
00450
00464 typedef struct ToolsServiceProperty {
00465 const char *name;
00466 } ToolsServiceProperty;
00467
00468
00478 typedef struct ToolsPluginSignalCb {
00479 const gchar *signame;
00480 gpointer callback;
00481 gpointer clientData;
00482 } ToolsPluginSignalCb;
00483
00484
00499 typedef struct ToolsPluginData {
00501 char const *name;
00506 GArray *regs;
00537 gboolean (*errorCb)(ToolsAppCtx *ctx,
00538 ToolsAppType type,
00539 gpointer data,
00540 struct ToolsPluginData *plugin);
00542 gpointer _private;
00543 } ToolsPluginData;
00544
00550 #if defined(G_PLATFORM_WIN32)
00551 # define TOOLS_MODULE_EXPORT VMTOOLS_EXTERN_C __declspec(dllexport)
00552 #elif defined(GCC_EXPLICIT_EXPORT)
00553 # define TOOLS_MODULE_EXPORT VMTOOLS_EXTERN_C __attribute__((visibility("default")))
00554 #else
00555 # define TOOLS_MODULE_EXPORT VMTOOLS_EXTERN_C
00556 #endif
00557
00569 typedef ToolsPluginData *(*ToolsPluginOnLoad)(ToolsAppCtx *ctx);
00570
00573 #endif
00574