00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef _VMWARE_TOOLS_GUESTRPC_H_
00020 #define _VMWARE_TOOLS_GUESTRPC_H_
00021
00039 #include <glib.h>
00040 #include "vmware/tools/utils.h"
00041
00042 G_BEGIN_DECLS
00043
00045 #define RPCIN_SETRETVALS RpcChannel_SetRetVals
00046 #define RPCIN_SETRETVALSF RpcChannel_SetRetValsF
00047
00048 struct RpcChannel;
00049
00051 typedef struct RpcInData {
00053 const char *name;
00058 const char *args;
00060 size_t argsSize;
00065 char *result;
00067 size_t resultLen;
00072 gboolean freeResult;
00074 void *appCtx;
00076 void *clientData;
00077 } RpcInData;
00078
00079
00084 typedef gboolean (*RpcIn_Callback)(RpcInData *data);
00085
00086
00088 typedef struct RpcChannelCallback {
00090 const char *name;
00092 RpcIn_Callback callback;
00094 gpointer clientData;
00096 gpointer xdrIn;
00103 gpointer xdrOut;
00108 size_t xdrInSize;
00109 } RpcChannelCallback;
00110
00111
00112 typedef gboolean (*RpcChannelStartFn)(struct RpcChannel *);
00113 typedef void (*RpcChannelStopFn)(struct RpcChannel *);
00114 typedef void (*RpcChannelShutdownFn)(struct RpcChannel *);
00115 typedef gboolean (*RpcChannelSendFn)(struct RpcChannel *,
00116 char const *data,
00117 size_t dataLen,
00118 char **result,
00119 size_t *resultLen);
00120 typedef void (*RpcChannelSetupFn)(struct RpcChannel *chan,
00121 GMainContext *mainCtx,
00122 const char *appName,
00123 gpointer appCtx);
00124
00125
00133 typedef void (*RpcChannelResetCb)(struct RpcChannel *chan,
00134 gboolean success,
00135 gpointer data);
00136
00137
00139 typedef struct RpcChannel {
00140 RpcChannelStartFn start;
00141 RpcChannelStopFn stop;
00142 RpcChannelSendFn send;
00143 RpcChannelSetupFn setup;
00144 RpcChannelShutdownFn shutdown;
00145 gpointer _private;
00146 } RpcChannel;
00147
00148
00157 G_INLINE_FUNC gboolean
00158 RpcChannel_Start(RpcChannel *chan)
00159 {
00160 g_return_val_if_fail(chan != NULL, FALSE);
00161 g_return_val_if_fail(chan->start != NULL, FALSE);
00162
00163 return chan->start(chan);
00164 }
00165
00166
00173 G_INLINE_FUNC void
00174 RpcChannel_Stop(RpcChannel *chan)
00175 {
00176 g_return_if_fail(chan != NULL);
00177 g_return_if_fail(chan->stop != NULL);
00178
00179 chan->stop(chan);
00180 }
00181
00182
00195 G_INLINE_FUNC gboolean
00196 RpcChannel_Send(RpcChannel *chan,
00197 char const *data,
00198 size_t dataLen,
00199 char **result,
00200 size_t *resultLen)
00201 {
00202 g_return_val_if_fail(chan != NULL, FALSE);
00203 g_return_val_if_fail(chan->send != NULL, FALSE);
00204
00205 return chan->send(chan, data, dataLen, result, resultLen);
00206 }
00207
00208 gboolean
00209 RpcChannel_BuildXdrCommand(const char *cmd,
00210 void *xdrProc,
00211 void *xdrData,
00212 char **result,
00213 size_t *resultLen);
00214
00215 RpcChannel *
00216 RpcChannel_Create(void);
00217
00218 gboolean
00219 RpcChannel_Destroy(RpcChannel *chan);
00220
00221 gboolean
00222 RpcChannel_Dispatch(RpcInData *data);
00223
00224 void
00225 RpcChannel_Setup(RpcChannel *chan,
00226 const gchar *appName,
00227 GMainContext *mainCtx,
00228 gpointer appCtx,
00229 RpcChannelResetCb resetCb,
00230 gpointer resetData);
00231
00232 void
00233 RpcChannel_RegisterCallback(RpcChannel *chan,
00234 RpcChannelCallback *rpc);
00235
00236 gboolean
00237 RpcChannel_SetRetVals(RpcInData *data,
00238 char const *result,
00239 gboolean retVal);
00240
00241 gboolean
00242 RpcChannel_SetRetValsF(RpcInData *data,
00243 char *result,
00244 gboolean retVal);
00245
00246 void
00247 RpcChannel_UnregisterCallback(RpcChannel *chan,
00248 RpcChannelCallback *rpc);
00249
00250
00251 RpcChannel *
00252 BackdoorChannel_New(void);
00253
00254 G_END_DECLS
00255
00258 #endif
00259