20 #include "mediabrowser_private.h"
21 #include "mediabrowser.h"
26 #define BUFFER_SIZE 20
27 char keyBuffer[BUFFER_SIZE] = {0};
30 int rbus_response = RBUS_ERROR_SUCCESS;
32 static rbusError_t remoteMethodHandler(rbusHandle_t handle,
char const *methodName,
33 rbusObject_t inParams, rbusObject_t outParams,
34 rbusMethodAsyncHandle_t asyncHandle);
35 rbusDataElement_t dataElements[3] = {
36 {METHOD_DISCOVER_MEDIA_DEVICES_SIZE, RBUS_ELEMENT_TYPE_METHOD, {NULL, NULL, NULL, NULL, NULL, remoteMethodHandler}},
37 {METHOD_GET_MEDIA_DEVICE_AT, RBUS_ELEMENT_TYPE_METHOD, {NULL, NULL, NULL, NULL, NULL, remoteMethodHandler}},
38 {METHOD_BROWSE_CONTENT_ON_MEDIA_SERVER, RBUS_ELEMENT_TYPE_METHOD, {NULL, NULL, NULL, NULL, NULL, remoteMethodHandler}}
44 rbus_response = rbus_open(&handle, RBUS_XUPNP_SERVICE_PROVIDER);
45 if(RBUS_ERROR_SUCCESS == rbus_response )
47 rbus_response = rbus_regDataElements(handle, 3, dataElements);
48 if(RBUS_ERROR_SUCCESS != rbus_response)
49 g_critical(
"[%s] Failed to register to RPC methods, reason %d ", __FUNCTION__ , rbus_response);
52 g_critical(
"[%s] Failed to open RPC Channel, reason %d ", __FUNCTION__ , rbus_response);
55 static void getServerDetails(rbusObject_t inParams, rbusObject_t outParams)
58 rbusProperty_t prop = NULL;
64 int count = g_list_length(msList);
67 prop = rbusObject_GetProperties(inParams);
69 if( NULL != prop && rbusProperty_Count(prop) > 0 )
71 value = rbusProperty_GetValue(prop);
72 index = rbusValue_GetInt32(value);
74 GList * entry = g_list_nth(msList, index);
79 rbusValue_Init(&value);
80 sprintf_s(keyBuffer, BUFFER_SIZE,
"server.name");
81 rbusValue_SetString(value, mserver->friendlyname);
82 rbusObject_SetValue(outParams, keyBuffer, value);
83 rbusValue_Release(value);
85 rbusValue_Init(&value);
86 sprintf_s(keyBuffer, BUFFER_SIZE,
"server.udn");
87 rbusValue_SetString(value, mserver->udn);
88 rbusObject_SetValue(outParams, keyBuffer, value);
89 rbusValue_Release(value);
92 g_mutex_unlock(locker);
95 g_message(
"[%s] No media servers discovered ", __FUNCTION__);
99 static void getServerContents(rbusObject_t inParams, rbusObject_t outParams)
102 char * udn = NULL, *path = NULL;
103 int start_index = 0 , max_results = 0;
106 char * entries = NULL;
109 prop = rbusObject_GetProperties(inParams);
111 if(NULL == prop || rbusProperty_Count(prop) != 4 )
113 g_message(
"[%s] Insufficient arguments args size = %d", __FUNCTION__ , rbusProperty_Count(prop));
116 value = rbusProperty_GetValue(prop);
117 udn = rbusValue_ToString(value,NULL,0);
119 prop = rbusProperty_GetNext(prop);
120 value = rbusProperty_GetValue(prop);
121 path = rbusValue_ToString(value,NULL,0);
123 prop = rbusProperty_GetNext(prop);
124 value = rbusProperty_GetValue(prop);
125 start_index = rbusValue_GetInt32(value);
127 prop = rbusProperty_GetNext(prop);
128 value = rbusProperty_GetValue(prop);
129 max_results = rbusValue_GetInt32(value);
132 if(browse_remote_dir_with_udn(udn,path,start_index,max_results,&total_count, &entries))
134 rbusValue_Init(&value);
135 sprintf_s(keyBuffer, BUFFER_SIZE,
"results.xmldata");
136 rbusValue_SetString(value, entries);
137 rbusObject_SetValue(outParams,keyBuffer, value);
138 rbusValue_Release(value);
140 rbusValue_Init(&value);
141 sprintf_s(keyBuffer, BUFFER_SIZE,
"results.size");
142 rbusValue_SetInt32(value, total_count);
143 rbusObject_SetValue(outParams,keyBuffer, value);
144 rbusValue_Release(value);
150 static rbusError_t remoteMethodHandler(rbusHandle_t handle,
char const *methodName,
151 rbusObject_t inParams, rbusObject_t outParams,
152 rbusMethodAsyncHandle_t asyncHandle)
157 g_message(
"[%s] Received a request for %s ", __FUNCTION__, methodName);
159 if (strcmp_s(METHOD_DISCOVER_MEDIA_DEVICES_SIZE,
160 strlen(METHOD_DISCOVER_MEDIA_DEVICES_SIZE),
161 methodName, &result) == EOK &&
166 g_mutex_lock(locker);
169 int count = g_list_length(msList);
170 g_message(
"[%s] Media servers discovered = %d ", __FUNCTION__, count);
171 rbusValue_Init(&value);
172 rbusValue_SetInt32(value, count);
173 rbusObject_SetValue(outParams,
"payload.size", value);
174 rbusValue_Release(value);
175 g_mutex_unlock(locker);
178 g_message(
"[%s] No media servers discovered ", __FUNCTION__);
179 rbusValue_Init(&value);
180 rbusValue_SetInt32(value, 0);
181 rbusObject_SetValue(outParams,
"payload.size", value);
182 rbusValue_Release(value);
184 return RBUS_ERROR_SUCCESS;
187 else if (strcmp_s(METHOD_GET_MEDIA_DEVICE_AT,
188 strlen(METHOD_GET_MEDIA_DEVICE_AT),
189 methodName, &result) == EOK &&
192 getServerDetails(inParams, outParams);
193 return RBUS_ERROR_SUCCESS;
195 else if (strcmp_s(METHOD_BROWSE_CONTENT_ON_MEDIA_SERVER,
196 strlen(METHOD_BROWSE_CONTENT_ON_MEDIA_SERVER),
197 methodName, &result) == EOK &&
200 getServerContents(inParams,outParams);
201 return RBUS_ERROR_SUCCESS;
205 return RBUS_ERROR_INVALID_METHOD;
208 void close_rpc_iface()
210 rbus_unregDataElements(handle, 3, dataElements);