1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 ******************************************************************/
21 #include "camessagehandler_singlethread.h"
28 #include "cainterface.h"
29 #include "caremotehandler.h"
30 #include "cainterfacecontroller_singlethread.h"
31 #include "caprotocolmessage.h"
33 #include "config.h" /* for coap protocol */
35 #include "oic_malloc.h"
36 #include "caadapterutils.h"
38 #define TAG1 "CAMH_ST"
40 #define MEMORY_ALLOCK_CHECK(arg) { if (arg == NULL) {OIC_LOG_V(DEBUG, TAG1, "Out of memory"); goto memory_error_exit;} }
42 #define MAX_THREAD_POOL_SIZE 10
46 SEND_TYPE_MULTICAST = 0, SEND_TYPE_UNICAST
51 CASendDataType_t type;
52 CARemoteEndpoint_t *remoteEndpoint;
53 CARequestInfo_t *requestInfo;
54 CAResponseInfo_t *responseInfo;
55 CAHeaderOption_t *options;
59 // message handler callback
60 static CAMessageHandlerCallback gHandlerCallback = NULL;
63 static CARequestCallback gRequestHandler = NULL;
64 static CAResponseCallback gResponseHandler = NULL;
66 static void CAProcessData(CAData_t *data)
68 OIC_LOG(DEBUG, TAG1, "IN");
69 VERIFY_NON_NULL_VOID(data, TAG1, "data");
70 VERIFY_NON_NULL_VOID(data->remoteEndpoint, TAG1, "remoteendpoint");
72 CAResult_t res = CA_STATUS_FAILED;
74 CASendDataType_t type = data->type;
76 if (type == SEND_TYPE_UNICAST)
78 coap_pdu_t *pdu = NULL;
80 if (data->requestInfo != NULL)
82 OIC_LOG_V(DEBUG, TAG1, "reqInfo avlbl");
84 pdu = (coap_pdu_t *) CAGeneratePdu(data->remoteEndpoint->resourceUri,
85 data->requestInfo->method, data->requestInfo->info);
87 else if (data->responseInfo != NULL)
89 OIC_LOG_V(DEBUG, TAG1, "resInfo avlbl");
91 pdu = (coap_pdu_t *) CAGeneratePdu(data->remoteEndpoint->resourceUri,
92 data->responseInfo->result, data->responseInfo->info);
96 OIC_LOG(DEBUG, TAG1, "request info, response info is empty");
99 // interface controller function call.
102 OIC_LOG_V(DEBUG, TAG1, "payload: %s", pdu->data);
104 OIC_LOG_V(DEBUG, TAG1, "code: %d", pdu->hdr->code);
106 OIC_LOG_V(DEBUG, TAG1, "buffer: %s", pdu->hdr);
108 res = CASendUnicastData(data->remoteEndpoint, pdu->hdr, pdu->length);
112 else if (type == SEND_TYPE_MULTICAST)
114 OIC_LOG(DEBUG, TAG1, "both requestInfo & responseInfo is not available");
116 coap_pdu_t *pdu = NULL;
118 memset(&info, 0, sizeof(CAInfo_t));
120 info.options = data->options;
121 info.numOptions = data->numOptions;
122 info.token = data->requestInfo->info.token;
124 pdu = (coap_pdu_t *) CAGeneratePdu(data->remoteEndpoint->resourceUri, CA_GET, info);
128 OIC_LOG_V(DEBUG, TAG1, "PDU Maker - payload : %s", pdu->data);
130 OIC_LOG_V(DEBUG, TAG1, "PDU Maker - type : %d", pdu->hdr->type);
132 OIC_LOG_V(DEBUG, TAG1, "PDU Maker - code : %d", pdu->hdr->code);
134 OIC_LOG_V(DEBUG, TAG1, "PDU Maker - id : %d", pdu->hdr->id);
136 OIC_LOG_V(DEBUG, TAG1, "PDU Maker - token : %s", pdu->hdr->token);
137 OIC_LOG_V(DEBUG, TAG1, "PDU Maker - buffer data : %s", pdu->hdr);
139 res = CASendMulticastData(pdu->hdr, pdu->length);
144 OIC_LOG(DEBUG, TAG1, "unknown type!");
147 if (gHandlerCallback != NULL)
149 gHandlerCallback("", res);
151 OIC_LOG(DEBUG, TAG1, "OUT");
154 static void CAReceivedPacketCallback(CARemoteEndpoint_t *endpoint, void *data, uint32_t dataLen)
156 OIC_LOG(DEBUG, TAG1, "IN");
157 VERIFY_NON_NULL_VOID(data, TAG1, "data");
160 uint32_t code = CA_NOT_FOUND;
161 pdu = (coap_pdu_t *) CAParsePDU((const char *) data, &code);
164 char uri[CA_MAX_URI_LENGTH] = { 0, };
166 if (CA_GET == code || CA_POST == code || CA_PUT == code || CA_DELETE == code )
168 CARequestInfo_t *ReqInfo;
169 ReqInfo = (CARequestInfo_t *) OICMalloc(sizeof(CARequestInfo_t));
170 VERIFY_NON_NULL_VOID(ReqInfo, TAG1, "reqInfo");
171 memset(ReqInfo, 0, sizeof(CARequestInfo_t));
172 CAGetRequestInfoFromPdu(pdu, ReqInfo, uri);
174 if (NULL != ReqInfo->info.options)
177 for (i = 0; i < ReqInfo->info.numOptions; i++)
179 OIC_LOG_V(DEBUG, TAG1, "Request- optionID: %d", ReqInfo->info.options[i].optionID);
181 OIC_LOG_V(DEBUG, TAG1, "Request- list: %s", ReqInfo->info.options[i].optionData);
185 if(NULL != ReqInfo->info.payload)
187 OIC_LOG_V(DEBUG, TAG1, "Request- payload: %s", ReqInfo->info.payload);
190 OIC_LOG_V(DEBUG, TAG1, "Request- code: %d", ReqInfo->method);
191 OIC_LOG_V(DEBUG, TAG1, "Request- token : %s", ReqInfo->info.token);
193 if (NULL != endpoint)
195 endpoint->resourceUri = (char *) OICMalloc(strlen(uri) + 1);
196 memset(endpoint->resourceUri, 0, strlen(uri) + 1);
197 memcpy(endpoint->resourceUri, uri, strlen(uri));
198 OIC_LOG_V(DEBUG, TAG1, "URI : %s", endpoint->resourceUri);
205 gRequestHandler(endpoint, ReqInfo);
208 CADestroyRequestInfoInternal(ReqInfo);
213 CAResponseInfo_t *ResInfo = (CAResponseInfo_t *) OICMalloc(sizeof(CAResponseInfo_t));
214 VERIFY_NON_NULL_VOID(ResInfo, TAG1, "ResInfo");
215 memset(ResInfo, 0, sizeof(CAResponseInfo_t));
216 CAGetResponseInfoFromPdu(pdu, ResInfo, uri);
218 if (NULL != ResInfo->info.options)
221 for (i = 0; i < ResInfo->info.numOptions; i++)
223 OIC_LOG_V(DEBUG, TAG1, "optionID: %d", ResInfo->info.options[i].optionID);
225 OIC_LOG_V(DEBUG, TAG1, "list: %s", ResInfo->info.options[i].optionData);
228 if(NULL != ResInfo->info.payload)
230 OIC_LOG_V(DEBUG, TAG1, "payload: %s", ResInfo->info.payload);
233 OIC_LOG_V(DEBUG, TAG1, "code: %d", ResInfo->result);
236 if (NULL != endpoint)
238 endpoint->resourceUri = (char *) OICMalloc(strlen(uri) + 1);
239 memset(endpoint->resourceUri, 0, strlen(uri) + 1);
240 memcpy(endpoint->resourceUri, uri, strlen(uri));
241 OIC_LOG_V(DEBUG, TAG1, "URI : %s", endpoint->resourceUri);
246 if (gResponseHandler)
248 gResponseHandler(endpoint, ResInfo);
250 CADestroyResponseInfoInternal(ResInfo);
254 if (endpoint && endpoint->resourceUri)
256 OICFree(endpoint->resourceUri);
258 OIC_LOG(DEBUG, TAG1, "OUT");
261 static void CANetworkChangedCallback(CALocalConnectivity_t *info, CANetworkStatus_t status)
263 OIC_LOG(DEBUG, TAG1, "IN");
264 OIC_LOG(DEBUG, TAG1, "OUT");
267 void CAHandleRequestResponseCallbacks()
269 //OIC_LOG(DEBUG, TAG1, "IN");
273 //OIC_LOG(DEBUG, TAG1, "OUT");
276 CAResult_t CADetachRequestMessage(const CARemoteEndpoint_t *object, const CARequestInfo_t *request)
278 OIC_LOG(DEBUG, TAG1, "IN");
280 VERIFY_NON_NULL(object, TAG1, "object");
281 VERIFY_NON_NULL(request, TAG1, "request");
283 CAData_t *data = (CAData_t *) OICMalloc(sizeof(CAData_t));
284 MEMORY_ALLOCK_CHECK(data);
287 memset(data, 0, sizeof(CAData_t));
289 // clone remote endpoint
290 CARemoteEndpoint_t *remoteEndpoint = CACloneRemoteEndpoint(object);
291 MEMORY_ALLOCK_CHECK(remoteEndpoint);
293 // clone request info
294 CARequestInfo_t *requestInfo = CACloneRequestInfo(request);
295 MEMORY_ALLOCK_CHECK(requestInfo);
298 data->type = SEND_TYPE_UNICAST;
299 data->remoteEndpoint = remoteEndpoint;
300 data->requestInfo = requestInfo;
301 data->responseInfo = NULL;
304 CADestroyRemoteEndpoint(remoteEndpoint);
305 CADestroyRequestInfoInternal(requestInfo);
307 OIC_LOG(DEBUG, TAG1, "OUT");
310 // memory error label.
313 CADestroyRemoteEndpointInternal(remoteEndpoint);
315 CADestroyRequestInfoInternal(requestInfo);
321 OIC_LOG(DEBUG, TAG1, "OUT");
322 return CA_MEMORY_ALLOC_FAILED;
325 CAResult_t CADetachResponseMessage(const CARemoteEndpoint_t *object,
326 const CAResponseInfo_t *response)
328 OIC_LOG(DEBUG, TAG1, "IN");
329 VERIFY_NON_NULL(object, TAG1, "object");
330 VERIFY_NON_NULL(response, TAG1, "response");
332 CAData_t *data = (CAData_t *) OICMalloc(sizeof(CAData_t));
333 MEMORY_ALLOCK_CHECK(data);
336 memset(data, 0, sizeof(CAData_t));
338 // clone remote endpoint
339 CARemoteEndpoint_t *remoteEndpoint = CACloneRemoteEndpoint(object);
340 MEMORY_ALLOCK_CHECK(remoteEndpoint);
342 // clone response info
343 CAResponseInfo_t *responseInfo = CACloneResponseInfo(response);
344 MEMORY_ALLOCK_CHECK(responseInfo);
347 data->type = SEND_TYPE_UNICAST;
348 data->remoteEndpoint = remoteEndpoint;
349 data->requestInfo = NULL;
350 data->responseInfo = responseInfo;
353 CADestroyRemoteEndpoint(remoteEndpoint);
354 CADestroyResponseInfoInternal(responseInfo);
356 OIC_LOG(DEBUG, TAG1, "OUT");
359 // memory error label.
362 CADestroyRemoteEndpointInternal(remoteEndpoint);
364 CADestroyResponseInfoInternal(responseInfo);
370 OIC_LOG(DEBUG, TAG1, "OUT");
371 return CA_MEMORY_ALLOC_FAILED;
374 CAResult_t CADetachMessageResourceUri(const CAURI_t resourceUri, const CAToken_t token, const CAHeaderOption_t* options,
377 OIC_LOG(DEBUG, TAG1, "IN");
378 if (resourceUri == NULL)
380 return CA_STATUS_FAILED;
383 CAData_t *data = (CAData_t *) OICMalloc(sizeof(CAData_t));
384 MEMORY_ALLOCK_CHECK(data);
387 memset(data, 0, sizeof(CAData_t));
390 memset(&addr, 0, sizeof(CAAddress_t));
391 CARemoteEndpoint_t *remoteEndpoint = CACreateRemoteEndpointInternal(resourceUri, addr,
392 CA_ETHERNET | CA_WIFI | CA_EDR | CA_LE);
395 data->type = SEND_TYPE_MULTICAST;
396 data->remoteEndpoint = remoteEndpoint;
397 CARequestInfo_t* ReqInfo = (CARequestInfo_t*) OICMalloc(sizeof(CARequestInfo_t));
398 memset(ReqInfo, 0, sizeof(CARequestInfo_t));
399 ReqInfo->method = CA_GET;
400 ReqInfo->info.token = token;
401 data->requestInfo = ReqInfo;
403 data->responseInfo = NULL;
404 data->options = NULL;
405 data->numOptions = 0;
407 if (options != NULL && numOptions > 0)
410 CAHeaderOption_t *temp = (CAHeaderOption_t *) OICMalloc(
411 sizeof(CAHeaderOption_t) * numOptions);
413 MEMORY_ALLOCK_CHECK(temp);
415 memset(temp, 0, sizeof(CAHeaderOption_t) * numOptions);
416 memcpy(temp, options, sizeof(CAHeaderOption_t) * numOptions);
418 data->options = temp;
419 data->numOptions = numOptions;
423 CADestroyRemoteEndpoint(remoteEndpoint);
426 OIC_LOG(DEBUG, TAG1, "OUT");
429 // memory error label.
432 CADestroyRemoteEndpointInternal(remoteEndpoint);
438 OIC_LOG(DEBUG, TAG1, "OUT");
439 return CA_MEMORY_ALLOC_FAILED;
442 void CASetMessageHandlerCallback(CAMessageHandlerCallback callback)
444 OIC_LOG(DEBUG, TAG1, "IN");
445 gHandlerCallback = callback;
446 OIC_LOG(DEBUG, TAG1, "OUT");
449 void CASetRequestResponseCallbacks(CARequestCallback ReqHandler, CAResponseCallback RespHandler)
451 OIC_LOG(DEBUG, TAG1, "IN");
452 gRequestHandler = ReqHandler;
453 gResponseHandler = RespHandler;
454 OIC_LOG(DEBUG, TAG1, "OUT");
457 CAResult_t CAInitializeMessageHandler()
459 OIC_LOG(DEBUG, TAG1, "IN");
460 CASetPacketReceivedCallback(CAReceivedPacketCallback);
462 CASetNetworkChangeCallback(CANetworkChangedCallback);
464 CAInitializeAdapters();
465 OIC_LOG(DEBUG, TAG1, "OUT");
469 void CATerminateMessageHandler()
471 OIC_LOG(DEBUG, TAG1, "IN");
472 // terminate interface adapters by controller
473 CATerminateAdapters();
475 OIC_LOG(DEBUG, TAG1, "OUT");