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 ******************************************************************/
23 #include "oic_malloc.h"
24 #include "oic_string.h"
25 #include "caremotehandler.h"
30 CAEndpoint_t *CACloneEndpoint(const CAEndpoint_t *rep)
34 OIC_LOG(ERROR, TAG, "parameter is null");
38 // allocate the remote end point structure.
39 CAEndpoint_t *clone = (CAEndpoint_t *)OICMalloc(sizeof (CAEndpoint_t));
42 OIC_LOG(ERROR, TAG, "CACloneRemoteEndpoint Out of memory");
50 CARequestInfo_t *CACloneRequestInfo(const CARequestInfo_t *rep)
54 OIC_LOG(ERROR, TAG, "parameter is null");
58 // check the method type of request info.
59 // Keep this check in sync with CAMethod_t
68 OIC_LOG_V(ERROR, TAG, "Method %u is invalid", rep->method);
72 // allocate the request info structure.
73 CARequestInfo_t *clone = (CARequestInfo_t *) OICMalloc(sizeof(CARequestInfo_t));
76 OIC_LOG(ERROR, TAG, "CACloneRequestInfo Out of memory");
80 CAResult_t result = CACloneInfo(&rep->info, &clone->info);
81 if(CA_STATUS_OK != result)
83 OIC_LOG(ERROR, TAG, "CACloneRequestInfo error in CACloneInfo");
84 CADestroyRequestInfoInternal(clone);
88 clone->method = rep->method;
89 clone->isMulticast = rep->isMulticast;
94 CAResponseInfo_t *CACloneResponseInfo(const CAResponseInfo_t *rep)
98 OIC_LOG(ERROR, TAG, "Response pointer is NULL");
102 // check the result value of response info.
103 // Keep this check in sync with CAResponseResult_t
114 case CA_UNAUTHORIZED_REQ:
116 case CA_FORBIDDEN_REQ:
118 case CA_METHOD_NOT_ALLOWED:
119 case CA_NOT_ACCEPTABLE:
120 case CA_REQUEST_ENTITY_INCOMPLETE:
121 case CA_REQUEST_ENTITY_TOO_LARGE:
122 case CA_TOO_MANY_REQUESTS:
123 case CA_INTERNAL_SERVER_ERROR:
124 case CA_NOT_IMPLEMENTED:
126 case CA_SERVICE_UNAVAILABLE:
127 case CA_RETRANSMIT_TIMEOUT:
128 case CA_PROXY_NOT_SUPPORTED:
131 OIC_LOG_V(ERROR, TAG, "Response code %u is invalid", rep->result);
135 // allocate the response info structure.
136 CAResponseInfo_t *clone = (CAResponseInfo_t *) OICCalloc(1, sizeof(CAResponseInfo_t));
139 OIC_LOG(ERROR, TAG, "CACloneResponseInfo Out of memory");
143 CAResult_t result = CACloneInfo(&rep->info, &clone->info);
144 if(CA_STATUS_OK != result)
146 OIC_LOG(ERROR, TAG, "CACloneResponseInfo error in CACloneInfo");
147 CADestroyResponseInfoInternal(clone);
151 clone->isMulticast = rep->isMulticast;
152 clone->result = rep->result;
156 CAEndpoint_t *CACreateEndpointObject(CATransportFlags_t flags,
157 CATransportAdapter_t adapter,
161 CAEndpoint_t *info = (CAEndpoint_t *)OICCalloc(1, sizeof(CAEndpoint_t));
164 OIC_LOG(ERROR, TAG, "Memory allocation failed !");
170 OICStrcpy(info->addr, sizeof(info->addr), address);
171 info->addr[MAX_ADDR_STR_SIZE_CA - 1] = '\0';
174 info->adapter = adapter;
180 void CAFreeEndpoint(CAEndpoint_t *rep)
185 static void CADestroyInfoInternal(CAInfo_t *info)
193 OICFree(info->token);
195 info->tokenLength = 0;
197 // free options field
198 OICFree(info->options);
199 info->options = NULL;
200 info->numOptions = 0;
202 // free payload field
203 OICFree((char *) info->payload);
204 info->payload = NULL;
205 info->payloadSize = 0;
208 OICFree(info->resourceUri);
209 info->resourceUri = NULL;
212 void CADestroyRequestInfoInternal(CARequestInfo_t *rep)
216 OIC_LOG(ERROR, TAG, "parameter is null");
220 CADestroyInfoInternal(&rep->info);
224 void CADestroyResponseInfoInternal(CAResponseInfo_t *rep)
228 OIC_LOG(ERROR, TAG, "parameter is null");
232 CADestroyInfoInternal(&rep->info);
236 void CADestroyErrorInfoInternal(CAErrorInfo_t *errorInfo)
238 if (NULL == errorInfo)
240 OIC_LOG(ERROR, TAG, "parameter is null");
244 CADestroyInfoInternal(&errorInfo->info);
248 CAResult_t CACloneInfo(const CAInfo_t *info, CAInfo_t *clone)
252 OIC_LOG(ERROR, TAG, "input parameter invalid");
253 return CA_STATUS_INVALID_PARAM;
256 memset(clone, 0 , sizeof(CAInfo_t));
258 //Do not free clone. we cannot declare it const, as the content is modified
259 if ((info->token) && (0 < info->tokenLength))
261 // allocate token field
262 uint8_t len = info->tokenLength;
264 char *temp = (char *) OICCalloc(1, (len + 1) * sizeof(char));
267 OIC_LOG(ERROR, TAG, "CACloneInfo Out of memory");
271 memcpy(temp, info->token, len);
274 clone->tokenLength = len;
277 if (info->options && (0 < info->numOptions))
281 (CAHeaderOption_t *) OICMalloc(sizeof(CAHeaderOption_t) * info->numOptions);
285 OIC_LOG(ERROR, TAG, "CACloneInfo Out of memory");
288 memcpy(clone->options, info->options, sizeof(CAHeaderOption_t) * info->numOptions);
289 clone->numOptions = info->numOptions;
292 memcpy(&(clone->identity), &(info->identity), sizeof(info->identity));
294 if ((info->payload) && (0 < info->payloadSize))
296 // allocate payload field
297 uint8_t *temp = OICMalloc(info->payloadSize);
300 OIC_LOG(ERROR, TAG, "CACloneInfo Out of memory");
303 memcpy(temp, info->payload, info->payloadSize);
306 clone->payload = temp;
307 clone->payloadSize = info->payloadSize;
309 clone->payloadFormat = info->payloadFormat;
310 clone->acceptFormat = info->acceptFormat;
312 if (info->resourceUri)
314 // allocate payload field
315 char *temp = OICStrdup(info->resourceUri);
318 OIC_LOG(ERROR, TAG, "CACloneInfo Out of memory");
322 // save the resourceUri
323 clone->resourceUri = temp;
326 #ifdef ROUTING_GATEWAY
327 clone->skipRetransmission = info->skipRetransmission;
330 clone->messageId = info->messageId;
331 clone->type = info->type;
336 CADestroyInfoInternal(clone);
337 return CA_MEMORY_ALLOC_FAILED;