G_BEGIN_DECLS
-/** Alias for RpcChannel_SetRetVals. */
-#define RPCIN_SETRETVALS RpcChannel_SetRetVals
+/** Aliases. */
+#define RPCIN_SETRETVALS RpcChannel_SetRetVals
+#define RPCIN_SETRETVALSF RpcChannel_SetRetValsF
struct RpcChannel;
typedef void (*RpcChannelStopFn)(struct RpcChannel *);
typedef void (*RpcChannelShutdownFn)(struct RpcChannel *);
typedef gboolean (*RpcChannelSendFn)(struct RpcChannel *,
- char *data,
+ char const *data,
size_t dataLen,
char **result,
size_t *resultLen);
G_INLINE_FUNC gboolean
RpcChannel_Send(RpcChannel *chan,
- char *data,
+ char const *data,
size_t dataLen,
char **result,
size_t *resultLen)
gboolean
RpcChannel_SetRetVals(RpcInData *data,
- char *result,
+ char const *result,
gboolean retVal);
+gboolean
+RpcChannel_SetRetValsF(RpcInData *data,
+ char *result,
+ gboolean retVal);
+
void
RpcChannel_UnregisterCallback(RpcChannel *chan,
RpcChannelCallback *rpc);
*/
typedef struct ToolsPluginData {
/** Name of the application (required). */
- char *name;
+ char const *name;
/**
* List of features provided by the app. Registration of applications
* happens in the same order provided by this array.
static gboolean
RpcInSend(RpcChannel *chan,
- char *data,
+ char const *data,
size_t dataLen,
char **result,
size_t *resultLen)
msg = Str_Asprintf(NULL, "ATR %s", chan->appName);
ASSERT_MEM_ALLOC(msg);
- data->freeResult = TRUE;
- return RPCIN_SETRETVALS(data, msg, TRUE);
+ return RPCIN_SETRETVALSF(data, msg, TRUE);
}
/**
- * Sets the result of the given RPC context to the given value. The result
- * should be a NULL-terminated string.
+ * Sets the non-freeable result of the given RPC context to the given value.
+ * The result should be a NULL-terminated string.
*
* @param[in] data RPC context.
* @param[in] result Result string.
gboolean
RpcChannel_SetRetVals(RpcInData *data,
- char *result,
+ char const *result,
gboolean retVal)
{
ASSERT(data);
+ /* This cast is safe: data->result will not be freed. */
+ data->result = (char *)result;
+ data->resultLen = strlen(data->result);
+ data->freeResult = FALSE;
+
+ return retVal;
+}
+
+
+/**
+ * Sets the freeable result of the given RPC context to the given value.
+ * The result should be a NULL-terminated string.
+ *
+ * @param[in] data RPC context.
+ * @param[in] result Result string.
+ * @param[in] retVal Return value of this function.
+ *
+ * @return @a retVal
+ */
+
+gboolean
+RpcChannel_SetRetValsF(RpcInData *data,
+ char *result,
+ gboolean retVal)
+{
+ ASSERT(data);
+
data->result = result;
data->resultLen = strlen(data->result);
+ data->freeResult = TRUE;
return retVal;
}
g_debug("%s: enter\n", __FUNCTION__);
char *reply;
size_t replyLen;
- char *toolsDnDVersion = TOOLS_DND_VERSION_3;
+ char const *toolsDnDVersion = TOOLS_DND_VERSION_3;
char *toolsCopyPasteVersion = NULL;
int version;
version = 1;
SetDnDVersion(version);
} else {
- char *vmxDnDVersion = QUERY_VMX_DND_VERSION;
+ char const *vmxDnDVersion = QUERY_VMX_DND_VERSION;
+
if (!RpcChannel_Send(ctx->rpc, vmxDnDVersion,
strlen(vmxDnDVersion), &reply, &replyLen)) {
g_debug("%s: could not get VMX dnd version capability, assuming v1\n",
version = 1;
SetCPVersion(version);
} else {
- char *vmxCopyPasteVersion = QUERY_VMX_COPYPASTE_VERSION;
+ char const *vmxCopyPasteVersion = QUERY_VMX_COPYPASTE_VERSION;
+
if (!RpcChannel_Send(ctx->rpc, vmxCopyPasteVersion,
strlen(vmxCopyPasteVersion), &reply, &replyLen)) {
g_debug("%s: could not get VMX copypaste version capability, assuming v1\n",
static gboolean
RpcDebugSend(RpcChannel *chan,
- char *data,
+ char const *data,
size_t dataLen,
char **result,
size_t *resultLen)