1414 * limitations under the License.
1515 */
1616
17+ #include < vector>
18+
1719#include " ../common.h"
1820#include " ../structures/handles.h"
1921#include " ../structures/oc-client-response.h"
2022#include " ../structures/oc-dev-addr.h"
2123#include " ../structures/oc-payload.h"
24+
2225extern " C" {
2326#include < ocpayload.h>
2427#include < ocstack.h>
28+ #include < rd_client.h>
29+ #include < stdint.h>
2530}
2631
2732static void deleteCallback (void *data) {
@@ -61,9 +66,41 @@ static OCStackApplicationResult defaultOCClientResponseHandler(
6166 return cResult;
6267}
6368
69+ #define OC_DO_CALL (env, info, arguments, conTypeIndex, qosIndex, cbIndex, \
70+ doCall) \
71+ do { \
72+ J2C_VALIDATE_VALUE_TYPE_THROW (env, (arguments)[0 ], napi_object, " handle" ); \
73+ J2C_VALIDATE_VALUE_TYPE_THROW (env, (arguments)[(cbIndex)], napi_function, \
74+ " callback" ); \
75+ J2C_DECLARE_VALUE_JS_THROW (OCConnectivityType, connectivityType, env, \
76+ arguments[(conTypeIndex)], napi_number, \
77+ " connectivityType" , uint32, uint32_t ); \
78+ J2C_DECLARE_VALUE_JS_THROW (OCQualityOfService, qos, env, \
79+ arguments[(qosIndex)], napi_number, " qos" , \
80+ uint32, uint32_t ); \
81+ \
82+ JSOCDoHandle *cData; \
83+ napi_value jsHandle; \
84+ HELPER_CALL_THROW (env, JSOCDoHandle::New (env, &jsHandle, &cData)); \
85+ \
86+ OCCallbackData cbData; \
87+ cbData.context = cData; \
88+ cbData.cb = defaultOCClientResponseHandler; \
89+ cbData.cd = deleteCallback; \
90+ \
91+ OCStackResult result = doCall; \
92+ \
93+ if (result == OC_STACK_OK) { \
94+ HELPER_CALL_THROW (env, \
95+ cData->Init (env, (arguments)[(cbIndex)], jsHandle)); \
96+ NAPI_CALL_THROW (env, napi_set_named_property (env, arguments[0 ], \
97+ " handle" , jsHandle)); \
98+ } \
99+ C2J_SET_RETURN_VALUE (env, info, double , ((double )result)); \
100+ } while (0 )
101+
64102napi_value bind_OCDoResource (napi_env env, napi_callback_info info) {
65103 J2C_DECLARE_ARGUMENTS (env, info, 9 );
66- J2C_VALIDATE_VALUE_TYPE_THROW (env, arguments[0 ], napi_object, " handle" );
67104 J2C_DECLARE_VALUE_JS_THROW (OCMethod, method, env, arguments[1 ], napi_number,
68105 " method" , uint32, uint32_t );
69106 J2C_GET_STRING_TRACKED_JS_THROW (requestUri, env, arguments[2 ], false ,
@@ -82,34 +119,89 @@ napi_value bind_OCDoResource(napi_env env, napi_callback_info info) {
82119 OCPayload *payload = nullptr ;
83120 HELPER_CALL_THROW (env, c_OCPayload (env, arguments[4 ], &payload));
84121
85- J2C_DECLARE_VALUE_JS_THROW (OCConnectivityType, connectivityType, env,
86- arguments[5 ], napi_number, " connectivityType" ,
87- uint32, uint32_t );
88- J2C_DECLARE_VALUE_JS_THROW (OCQualityOfService, qos, env, arguments[6 ],
89- napi_number, " qos" , uint32, uint32_t );
122+ J2C_VALIDATE_IS_ARRAY_THROW (env, arguments[8 ], true , " options" );
90123
91- J2C_VALIDATE_VALUE_TYPE_THROW (env, arguments[7 ], napi_function, " callback" );
124+ OC_DO_CALL (env, info, arguments, 5 , 6 , 7 ,
125+ OCDoResource (&(cData->data ), method, requestUri, destination,
126+ payload, connectivityType, qos, &cbData, nullptr , 0 ));
127+ }
92128
93- J2C_VALIDATE_IS_ARRAY_THROW (env, arguments[8 ], true , " options" );
129+ napi_value bind_OCRDDiscover (napi_env env, napi_callback_info info) {
130+ J2C_DECLARE_ARGUMENTS (env, info, 4 );
131+ OC_DO_CALL (env, info, arguments, 1 , 3 , 2 ,
132+ OCRDDiscover (&(cData->data ), connectivityType, &cbData, qos));
133+ }
94134
95- JSOCDoHandle *cData;
135+ static std::string c_OCResourceArray (
136+ napi_env env, napi_value source,
137+ std::vector<OCResourceHandle> &destination) {
138+ uint32_t length, index;
139+ napi_handle_scope scope;
96140 napi_value jsHandle;
97- HELPER_CALL_THROW (env, JSOCDoHandle::New (env, &jsHandle, &cData));
98-
99- OCCallbackData cbData;
100- cbData.context = cData;
101- cbData.cb = defaultOCClientResponseHandler;
102- cbData.cd = deleteCallback;
103- OCStackResult result =
104- OCDoResource (&(cData->data ), method, requestUri, destination, payload,
105- connectivityType, qos, &cbData, nullptr , 0 );
106-
107- if (result == OC_STACK_OK) {
108- HELPER_CALL_THROW (env, cData->Init (env, arguments[7 ], jsHandle));
109- NAPI_CALL_THROW (
110- env, napi_set_named_property (env, arguments[0 ], " handle" , jsHandle));
141+ JSOCResourceHandle *cResData;
142+
143+ J2C_VALIDATE_IS_ARRAY_RETURN (env, source, false , " resource array" );
144+
145+ NAPI_CALL_RETURN (env, napi_get_array_length (env, source, &length));
146+ if (length > UINT8_MAX) {
147+ return LOCAL_MESSAGE (" resource array length exceeds UINT8_MAX" );
148+ }
149+
150+ destination.resize (length);
151+ for (index = 0 ; index < length; index++) {
152+ NAPI_CALL_RETURN (env, napi_open_handle_scope (env, &scope));
153+ NAPI_CALL_RETURN (env, napi_get_element (env, source, index, &jsHandle));
154+ HELPER_CALL_RETURN (JSOCResourceHandle::Get (env, jsHandle, &cResData));
155+ destination[index] = cResData->data ;
156+ NAPI_CALL_RETURN (env, napi_close_handle_scope (env, scope));
111157 }
112- C2J_SET_RETURN_VALUE (env, info, double , ((double )result));
158+
159+ return std::string ();
160+ }
161+
162+ #define OC_DO_RESOURCE_LIST_CALL (env, info, arguments, hostIndex, \
163+ conTypeIndex, resourceListIndex, cbIndex, \
164+ qosIndex, doCall) \
165+ do { \
166+ J2C_GET_STRING_TRACKED_JS_THROW (host, env, (arguments)[(hostIndex)], \
167+ false , " host" ); \
168+ std::vector<OCResourceHandle> handles; \
169+ HELPER_CALL_THROW ( \
170+ env, \
171+ c_OCResourceArray (env, (arguments)[(resourceListIndex)], handles)); \
172+ \
173+ OC_DO_CALL ((env), (info), (arguments), (conTypeIndex), (qosIndex), \
174+ (cbIndex), doCall); \
175+ } while (0 )
176+
177+ napi_value bind_OCRDPublish (napi_env env, napi_callback_info info) {
178+ J2C_DECLARE_ARGUMENTS (env, info, 7 );
179+ J2C_DECLARE_VALUE_JS_THROW (uint32_t , ttl, env, arguments[4 ], napi_number,
180+ " ttl" , uint32, uint32_t );
181+ OC_DO_RESOURCE_LIST_CALL (
182+ env, info, arguments, 1 , 2 , 3 , 5 , 6 ,
183+ OCRDPublish (&(cData->data ), host, connectivityType, handles.data (),
184+ handles.size (), ttl, &cbData, qos));
185+ }
186+
187+ napi_value bind_OCRDPublishWithDeviceId (napi_env env, napi_callback_info info) {
188+ J2C_DECLARE_ARGUMENTS (env, info, 8 );
189+ J2C_GET_STRING_TRACKED_JS_THROW (id, env, arguments[2 ], false , " id" );
190+ J2C_DECLARE_VALUE_JS_THROW (uint32_t , ttl, env, arguments[5 ], napi_number,
191+ " ttl" , uint32, uint32_t );
192+ OC_DO_RESOURCE_LIST_CALL (
193+ env, info, arguments, 1 , 3 , 4 , 6 , 7 ,
194+ OCRDPublishWithDeviceId (&(cData->data ), host, (const unsigned char *)id,
195+ connectivityType, handles.data (), handles.size (),
196+ ttl, &cbData, qos));
197+ }
198+
199+ napi_value bind_OCRDDelete (napi_env env, napi_callback_info info) {
200+ J2C_DECLARE_ARGUMENTS (env, info, 6 );
201+ OC_DO_RESOURCE_LIST_CALL (
202+ env, info, arguments, 1 , 2 , 3 , 4 , 5 ,
203+ OCRDDelete (&(cData->data ), host, connectivityType, handles.data (),
204+ handles.size (), &cbData, qos));
113205}
114206
115207napi_value bind_OCCancel (napi_env env, napi_callback_info info) {
0 commit comments