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
00047 struct RpcChannel;
00048
00050 typedef struct RpcInData {
00052 const char *name;
00057 const char *args;
00059 size_t argsSize;
00064 char *result;
00066 size_t resultLen;
00071 gboolean freeResult;
00073 void *appCtx;
00075 void *clientData;
00076 } RpcInData;
00077
00078
00083 typedef gboolean (*RpcIn_Callback)(RpcInData *data);
00084
00085
00087 typedef struct RpcChannelCallback {
00089 const char *name;
00091 RpcIn_Callback callback;
00093 gpointer clientData;
00095 gpointer xdrIn;
00102 gpointer xdrOut;
00107 size_t xdrInSize;
00108 } RpcChannelCallback;
00109
00110
00111 typedef gboolean (*RpcChannelStartFn)(struct RpcChannel *);
00112 typedef void (*RpcChannelStopFn)(struct RpcChannel *);
00113 typedef void (*RpcChannelShutdownFn)(struct RpcChannel *);
00114 typedef gboolean (*RpcChannelSendFn)(struct RpcChannel *,
00115 char *data,
00116 size_t dataLen,
00117 char **result,
00118 size_t *resultLen);
00119
00120
00128 typedef void (*RpcChannelResetCb)(struct RpcChannel *chan,
00129 gboolean success,
00130 gpointer data);
00131
00132
00134 typedef struct RpcChannel {
00135 RpcChannelStartFn start;
00136 RpcChannelStopFn stop;
00137 RpcChannelSendFn send;
00138
00139 RpcChannelShutdownFn shutdown;
00140 gchar *appName;
00141 GHashTable *rpcs;
00142 GMainContext *mainCtx;
00143 GSource *resetCheck;
00144 gpointer appCtx;
00145 RpcChannelCallback resetReg;
00146 RpcChannelResetCb resetCb;
00147 gpointer resetData;
00148 gboolean rpcError;
00149 guint rpcErrorCount;
00150 gpointer _private;
00151 } RpcChannel;
00152
00153
00162 G_INLINE_FUNC gboolean
00163 RpcChannel_Start(RpcChannel *chan)
00164 {
00165 g_return_val_if_fail(chan != NULL, FALSE);
00166 g_return_val_if_fail(chan->start != NULL, FALSE);
00167
00168 return chan->start(chan);
00169 }
00170
00171
00178 G_INLINE_FUNC void
00179 RpcChannel_Stop(RpcChannel *chan)
00180 {
00181 g_return_if_fail(chan != NULL);
00182 g_return_if_fail(chan->stop != NULL);
00183
00184 chan->stop(chan);
00185 }
00186
00187
00200 G_INLINE_FUNC gboolean
00201 RpcChannel_Send(RpcChannel *chan,
00202 char *data,
00203 size_t dataLen,
00204 char **result,
00205 size_t *resultLen)
00206 {
00207 g_return_val_if_fail(chan != NULL, FALSE);
00208 g_return_val_if_fail(chan->send != NULL, FALSE);
00209
00210 return chan->send(chan, data, dataLen, result, resultLen);
00211 }
00212
00213 gboolean
00214 RpcChannel_BuildXdrCommand(const char *cmd,
00215 void *xdrProc,
00216 void *xdrData,
00217 char **result,
00218 size_t *resultLen);
00219
00220 gboolean
00221 RpcChannel_Destroy(RpcChannel *chan);
00222
00223 gboolean
00224 RpcChannel_Dispatch(RpcInData *data);
00225
00226 void
00227 RpcChannel_Setup(RpcChannel *chan,
00228 const gchar *appName,
00229 GMainContext *mainCtx,
00230 gpointer appCtx,
00231 RpcChannelResetCb resetCb,
00232 gpointer resetData);
00233
00234 void
00235 RpcChannel_RegisterCallback(RpcChannel *chan,
00236 RpcChannelCallback *rpc);
00237
00238 gboolean
00239 RpcChannel_SetRetVals(RpcInData *data,
00240 char *result,
00241 gboolean retVal);
00242
00243 void
00244 RpcChannel_UnregisterCallback(RpcChannel *chan,
00245 RpcChannelCallback *rpc);
00246
00247
00248 RpcChannel *
00249 RpcChannel_NewBackdoorChannel(GMainContext *mainCtx);
00250
00251 G_END_DECLS
00252
00255 #endif
00256