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_NOT_ACCEPTABLE:
119 case CA_REQUEST_ENTITY_INCOMPLETE:
120 case CA_REQUEST_ENTITY_TOO_LARGE:
121 case CA_INTERNAL_SERVER_ERROR:
122 case CA_RETRANSMIT_TIMEOUT:
125 OIC_LOG_V(ERROR, TAG, "Response code %u is invalid", rep->result);
129 // allocate the response info structure.
130 CAResponseInfo_t *clone = (CAResponseInfo_t *) OICCalloc(1, sizeof(CAResponseInfo_t));
133 OIC_LOG(ERROR, TAG, "CACloneResponseInfo Out of memory");
137 CAResult_t result = CACloneInfo(&rep->info, &clone->info);
138 if(CA_STATUS_OK != result)
140 OIC_LOG(ERROR, TAG, "CACloneResponseInfo error in CACloneInfo");
141 CADestroyResponseInfoInternal(clone);
145 clone->isMulticast = rep->isMulticast;
146 clone->result = rep->result;
150 CAEndpoint_t *CACreateEndpointObject(CATransportFlags_t flags,
151 CATransportAdapter_t adapter,
155 CAEndpoint_t *info = (CAEndpoint_t *)OICCalloc(1, sizeof(CAEndpoint_t));
158 OIC_LOG(ERROR, TAG, "Memory allocation failed !");
164 OICStrcpy(info->addr, sizeof(info->addr), address);
165 info->addr[MAX_ADDR_STR_SIZE_CA - 1] = '\0';
168 info->adapter = adapter;
174 void CAFreeEndpoint(CAEndpoint_t *rep)
179 static void CADestroyInfoInternal(CAInfo_t *info)
182 OICFree(info->token);
184 info->tokenLength = 0;
186 // free options field
187 OICFree(info->options);
188 info->options = NULL;
189 info->numOptions = 0;
191 // free payload field
192 OICFree((char *) info->payload);
193 info->payload = NULL;
194 info->payloadSize = 0;
197 OICFree(info->resourceUri);
198 info->resourceUri = NULL;
201 void CADestroyRequestInfoInternal(CARequestInfo_t *rep)
205 OIC_LOG(ERROR, TAG, "parameter is null");
209 CADestroyInfoInternal(&rep->info);
213 void CADestroyResponseInfoInternal(CAResponseInfo_t *rep)
217 OIC_LOG(ERROR, TAG, "parameter is null");
221 CADestroyInfoInternal(&rep->info);
225 void CADestroyErrorInfoInternal(CAErrorInfo_t *errorInfo)
227 if (NULL == errorInfo)
229 OIC_LOG(ERROR, TAG, "parameter is null");
233 CADestroyInfoInternal(&errorInfo->info);
237 CAResult_t CACloneInfo(const CAInfo_t *info, CAInfo_t *clone)
241 OIC_LOG(ERROR, TAG, "input parameter invalid");
242 return CA_STATUS_INVALID_PARAM;
245 memset(clone, 0 , sizeof(CAInfo_t));
247 //Do not free clone. we cannot declare it const, as the content is modified
248 if ((info->token) && (0 < info->tokenLength))
250 // allocate token field
251 uint8_t len = info->tokenLength;
253 char *temp = (char *) OICMalloc(len * sizeof(char));
256 OIC_LOG(ERROR, TAG, "CACloneInfo Out of memory");
260 memcpy(temp, info->token, len);
263 clone->tokenLength = len;
266 if (info->options && (0 < info->numOptions))
270 (CAHeaderOption_t *) OICMalloc(sizeof(CAHeaderOption_t) * info->numOptions);
274 OIC_LOG(ERROR, TAG, "CACloneInfo Out of memory");
277 memcpy(clone->options, info->options, sizeof(CAHeaderOption_t) * info->numOptions);
278 clone->numOptions = info->numOptions;
281 memcpy(&(clone->identity), &(info->identity), sizeof(info->identity));
283 if ((info->payload) && (0 < info->payloadSize))
285 // allocate payload field
286 uint8_t *temp = OICMalloc(info->payloadSize);
289 OIC_LOG(ERROR, TAG, "CACloneInfo Out of memory");
292 memcpy(temp, info->payload, info->payloadSize);
295 clone->payload = temp;
296 clone->payloadSize = info->payloadSize;
298 clone->payloadFormat = info->payloadFormat;
299 clone->acceptFormat = info->acceptFormat;
301 if (info->resourceUri)
303 // allocate payload field
304 char *temp = OICStrdup(info->resourceUri);
307 OIC_LOG(ERROR, TAG, "CACloneInfo Out of memory");
311 // save the resourceUri
312 clone->resourceUri = temp;
315 #ifdef ROUTING_GATEWAY
316 clone->skipRetransmission = info->skipRetransmission;
319 clone->messageId = info->messageId;
320 clone->type = info->type;
325 CADestroyInfoInternal(clone);
326 return CA_MEMORY_ALLOC_FAILED;