RDK Documentation (Open Sourced RDK Components)
mbwsr_rpc_srv.c
1 /*
2  * If not stated otherwise in this file or this component's Licenses.txt file the
3  * following copyright and licenses apply:
4  *
5  * Copyright 2021 RDK Management
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18 */
19 
20 #include "mediabrowser_private.h"
21 #include "mediabrowser.h"
22 
23 #include <rbus.h>
24 
25 
26 #define BUFFER_SIZE 20
27 char keyBuffer[BUFFER_SIZE] = {0};
28 
29 rbusHandle_t handle;
30 int rbus_response = RBUS_ERROR_SUCCESS;
31 
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}}
39  };
40 
41 void init_ipc_iface()
42 {
43 
44  rbus_response = rbus_open(&handle, RBUS_XUPNP_SERVICE_PROVIDER);
45  if(RBUS_ERROR_SUCCESS == rbus_response )
46  {
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);
50  }
51  else
52  g_critical("[%s] Failed to open RPC Channel, reason %d ", __FUNCTION__ , rbus_response);
53 }
54 
55 static void getServerDetails(rbusObject_t inParams, rbusObject_t outParams)
56 {
57  rbusValue_t value;
58  rbusProperty_t prop = NULL;
59  if (NULL != msList)
60  {
61  g_mutex_lock(locker);
62 
63  //Total count
64  int count = g_list_length(msList);
65  int index = -1;
66 
67  prop = rbusObject_GetProperties(inParams);
68 
69  if( NULL != prop && rbusProperty_Count(prop) > 0 ) //expecting only one
70  {
71  value = rbusProperty_GetValue(prop);
72  index = rbusValue_GetInt32(value);
73 
74  GList * entry = g_list_nth(msList, index);
75  if(NULL!= entry)
76  {
77  mediaServerCfg *mserver = (mediaServerCfg *)entry->data;
78 
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);
84 
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);
90  }
91  }
92  g_mutex_unlock(locker);
93  }
94  else{
95  g_message("[%s] No media servers discovered ", __FUNCTION__);
96  }
97 }
98 
99 static void getServerContents(rbusObject_t inParams, rbusObject_t outParams)
100 {
101  rbusProperty_t prop;
102  char * udn = NULL, *path = NULL;
103  int start_index = 0 , max_results = 0;
104  rbusValue_t value;
105 
106  char * entries = NULL;
107  int total_count = 0;
108 
109  prop = rbusObject_GetProperties(inParams);
110 
111  if(NULL == prop || rbusProperty_Count(prop) != 4 )
112  {
113  g_message("[%s] Insufficient arguments args size = %d", __FUNCTION__ , rbusProperty_Count(prop));
114  return ;
115  }
116  value = rbusProperty_GetValue(prop);
117  udn = rbusValue_ToString(value,NULL,0); //UDN
118 
119  prop = rbusProperty_GetNext(prop);
120  value = rbusProperty_GetValue(prop);
121  path = rbusValue_ToString(value,NULL,0); //path
122 
123  prop = rbusProperty_GetNext(prop);
124  value = rbusProperty_GetValue(prop);
125  start_index = rbusValue_GetInt32(value); //start index
126 
127  prop = rbusProperty_GetNext(prop);
128  value = rbusProperty_GetValue(prop);
129  max_results = rbusValue_GetInt32(value); //max results
130 
131  // Get mediaserver config based on UDN
132  if(browse_remote_dir_with_udn(udn,path,start_index,max_results,&total_count, &entries))
133  {
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);
139 
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);
145  }
146 }
147 
148 // RBUS connector methods
149 
150 static rbusError_t remoteMethodHandler(rbusHandle_t handle, char const *methodName,
151  rbusObject_t inParams, rbusObject_t outParams,
152  rbusMethodAsyncHandle_t asyncHandle)
153 {
154  rbusValue_t value;
155  int result = -1;
156 
157  g_message("[%s] Received a request for %s ", __FUNCTION__, methodName);
158 
159  if (strcmp_s(METHOD_DISCOVER_MEDIA_DEVICES_SIZE,
160  strlen(METHOD_DISCOVER_MEDIA_DEVICES_SIZE),
161  methodName, &result) == EOK &&
162  !result)
163  {
164  if (NULL != msList)
165  {
166  g_mutex_lock(locker);
167 
168  //Total count
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);
176  }
177  else{
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);
183  }
184  return RBUS_ERROR_SUCCESS;
185  }
186 
187  else if (strcmp_s(METHOD_GET_MEDIA_DEVICE_AT,
188  strlen(METHOD_GET_MEDIA_DEVICE_AT),
189  methodName, &result) == EOK &&
190  !result)
191  {
192  getServerDetails(inParams, outParams);
193  return RBUS_ERROR_SUCCESS;
194  }
195  else if (strcmp_s(METHOD_BROWSE_CONTENT_ON_MEDIA_SERVER,
196  strlen(METHOD_BROWSE_CONTENT_ON_MEDIA_SERVER),
197  methodName, &result) == EOK &&
198  !result)
199  {
200  getServerContents(inParams,outParams);
201  return RBUS_ERROR_SUCCESS;
202  }
203  else
204  {
205  return RBUS_ERROR_INVALID_METHOD;
206  }
207 }
208 void close_rpc_iface()
209 {
210  rbus_unregDataElements(handle, 3, dataElements);
211  rbus_close(handle);
212 }
_mediaServerCfg
Definition: mediabrowser_private.h:36