4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
\r
6 * Contact: Hakjoo Ko <hakjoo.ko@samsung.com>
\r
7 * Mahendra Kumar Prajapat <mahendra.p@samsung.com>
\r
8 * Harsha Shekar <h.shekar@samsung.com>
\r
11 * Licensed under the Apache License, Version 2.0 (the "License");
\r
12 * you may not use this file except in compliance with the License.
\r
13 * You may obtain a copy of the License at
\r
15 * http://www.apache.org/licenses/LICENSE-2.0
\r
17 * Unless required by applicable law or agreed to in writing, software
\r
18 * distributed under the License is distributed on an "AS IS" BASIS,
\r
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
20 * See the License for the specific language governing permissions and
\r
21 * limitations under the License.
\r
27 * @file drm_client.cpp
\r
28 * @brief DRM Client API defintions.
\r
29 * @author Mahendra Kumar Prajapat (mahendra.p@samsung.com)
\r
30 * @author Harsha Shekar (h.shekar@samsung.com)
\r
32 * @history 0.1: First version of DRM Client API Definitions.
\r
39 #include "drm_client.h"
\r
40 #include "drm_client_ipc.h"
\r
41 #include "drm_client_log.h"
\r
42 //#include "security-server.h"
\r
47 #define EXPORT_API __attribute__((visibility("default")))
\r
56 * @param[in] file_path Specifies the pointer points a DRM file path.
\r
57 * @return This function returns DRM file type.
\r
62 static drm_file_type_e _drm_client_get_file_type(const char* file_path);
\r
65 * An application can check that a file is DRM file
\r
66 * (OMA DRM, PlayReady, DivX etc.)
\r
68 * @param[in] file_path Specifies the pointer points a DRM file path.
\r
69 * @param[out] is_drm_file DRM_TRUE if the input file is a DRM file
\r
71 * @return 0 on success, else a negative error value
\r
72 * @retval DRM_RETURN_SUCCESS on success
\r
73 * @retval DRM_RETURN_INVALID_ARG if arguments are invalid
\r
74 * @retval DRM_RETURN_COMMUNICATION_ERROR if socket error
\r
75 * @retval DRM_RETURN_INTERNAL_ERROR if operation error
\r
81 EXPORT_API int drm_is_drm_file(const char *file_path,
\r
82 drm_bool_type_e *is_drm_file)
\r
84 DRM_CLIENT_LOG("Enter: file_path = %s", (!file_path) ? NULL:file_path);
\r
85 drm_request_data_s req_data;
\r
86 drm_response_data_s resp_data;
\r
88 drm_file_type_e file_type = DRM_TYPE_UNDEFINED;
\r
91 /* Check input parameters */
\r
92 if (!file_path || '\0' == file_path[0] || !is_drm_file) {
\r
93 DRM_CLIENT_EXCEPTION("Invalid Arg!!, file_path = %p, is_drm_file = %p",
\r
94 file_path, is_drm_file);
\r
95 return DRM_RETURN_INVALID_ARG;
\r
98 file_type = _drm_client_get_file_type(file_path);
\r
100 switch (file_type) {
\r
101 case DRM_TYPE_OMA_V1:
\r
102 case DRM_TYPE_OMA_V2:
\r
103 case DRM_TYPE_PLAYREADY:
\r
104 case DRM_TYPE_PLAYREADY_ENVELOPE:
\r
105 /* All the above 4 cases correspond to a file being DRM file! */
\r
106 DRM_CLIENT_LOG("file_type = %d", file_type);
\r
107 *is_drm_file = DRM_TRUE;
\r
110 case DRM_TYPE_DIVX: {
\r
112 /* memset the structures */
\r
113 memset(&req_data, 0x0, sizeof(drm_request_data_s));
\r
114 memset(&resp_data, 0x0, sizeof(drm_response_data_s));
\r
116 /* In this case, further analysis of headers required to identify DRM file */
\r
117 /* Contact the server to perform operations */
\r
119 /* Store the input parameters to the Request Data structure to be sent to server */
\r
120 if ((ret_cpy = g_strlcpy(req_data.fixed_data.request_data, file_path,
\r
121 DRM_MAX_LEN_FILEPATH)) >= DRM_MAX_LEN_FILEPATH) {
\r
122 DRM_CLIENT_EXCEPTION("file_path = %s, filepath_len = %d, ret_cpy = %d",
\r
123 file_path, strlen(file_path), ret_cpy);
\r
124 return DRM_RETURN_INVALID_ARG;
\r
127 /* Tell the server which API to be used */
\r
128 req_data.fixed_data.api_name = DRM_IS_DRM_FILE;
\r
130 /* Call the Client Communication API */
\r
131 if ((ret_comm = drm_client_comm(&req_data, &resp_data)) != 0) {
\r
132 DRM_CLIENT_EXCEPTION("drm_client_comm error!!, ret_comm = %d", ret_comm);
\r
133 return DRM_RETURN_COMMUNICATION_ERROR;
\r
136 /* Copy the response obtained from the server into the output parameter */
\r
137 if (resp_data.fixed_data.resp_result != 0) {
\r
138 DRM_CLIENT_EXCEPTION("Error returned from server!!, resp_data.fixed_data.resp_result = 0x%x",
\r
139 resp_data.fixed_data.resp_result);
\r
140 *is_drm_file = DRM_FALSE;
\r
143 DRM_CLIENT_LOG("resp_data.fixed_data.resp_result = 0x%x", resp_data.fixed_data.resp_result);
\r
144 *is_drm_file = resp_data.fixed_data.bool_val;
\r
150 case DRM_TYPE_UNDEFINED:
\r
151 DRM_CLIENT_LOG("file_type = %d", file_type);
\r
152 *is_drm_file = DRM_FALSE;
\r
156 DRM_CLIENT_EXCEPTION("Undefined file type!!");
\r
157 *is_drm_file = DRM_FALSE;
\r
161 DRM_CLIENT_LOG("Exit:Success!!, is_drm_file = %d",
\r
163 return DRM_RETURN_SUCCESS;
\r
166 DRM_CLIENT_EXCEPTION("Exit:failed!!, is_drm_file = %d",
\r
168 return DRM_RETURN_INTERNAL_ERROR;
\r
173 * An application can get DRM file type of the file that is
\r
174 * specified in file_path
\r
176 * @param[in] file_path Specifies the pointer points a DRM file path.
\r
177 * @param[out] file_type DRM file type.
\r
178 * @return 0 on success, else a negative error value
\r
179 * @retval DRM_RETURN_SUCCESS on success
\r
180 * @retval DRM_RETURN_INVALID_ARG if arguments are invalid
\r
185 EXPORT_API int drm_get_file_type(const char *file_path, drm_file_type_e *file_type)
\r
187 DRM_CLIENT_LOG("Enter: file_path = %s", (!file_path) ? NULL:file_path);
\r
189 /* Check input parameters */
\r
190 if (!file_path || '\0' == file_path[0] || !file_type) {
\r
191 DRM_CLIENT_EXCEPTION("Invalid Arg!!, file_path = %p, file_type = %p",
\r
192 file_path, file_type);
\r
193 return DRM_RETURN_INVALID_ARG;
\r
196 *file_type = _drm_client_get_file_type(file_path);
\r
197 DRM_CLIENT_LOG("Exit:Success!! file_type = %d", *file_type);
\r
198 return DRM_RETURN_SUCCESS;
\r
202 * An application can check that a DRM file has valid license or not.
\r
204 * @param[in] file_path DRM file path.
\r
205 * @param[in] perm_type Enumeration type of permission.
\r
206 * @param[out] license_status license status.
\r
207 * @return 0 on success, else a negative error value
\r
208 * @retval DRM_RETURN_SUCCESS on success
\r
209 * @retval DRM_RETURN_INVALID_ARG if arguments are invalid
\r
210 * @retval DRM_RETURN_COMMUNICATION_ERROR if socket error
\r
211 * @retval DRM_RETURN_INTERNAL_ERROR if operation error
\r
216 EXPORT_API int drm_get_license_status(const char *file_path,
\r
217 drm_permission_type_e perm_type,
\r
218 drm_license_status_e *license_status)
\r
220 DRM_CLIENT_LOG("Enter: file_path = %s, perm_type = %d",
\r
221 (!file_path) ? NULL:file_path, perm_type);
\r
223 drm_request_data_s req_data;
\r
224 drm_response_data_s resp_data;
\r
226 drm_result_e result = DRM_RETURN_SUCCESS;
\r
229 /* memset the structures */
\r
230 memset(&req_data, 0x0, sizeof(drm_request_data_s));
\r
231 memset(&resp_data, 0x0, sizeof(drm_response_data_s));
\r
233 /* Check input parameters */
\r
234 if (!file_path || '\0' == file_path[0] || !license_status) {
\r
235 DRM_CLIENT_EXCEPTION("Invalid Arg!!, file_path = %p, license_status = %p",
\r
236 file_path, license_status);
\r
237 return DRM_RETURN_INVALID_ARG;
\r
240 /* Store the input parameters to the Request Data structure to be sent to server */
\r
241 if ((ret_cpy = g_strlcpy(req_data.fixed_data.request_data, file_path,
\r
242 DRM_MAX_LEN_FILEPATH)) >= DRM_MAX_LEN_FILEPATH) {
\r
243 DRM_CLIENT_EXCEPTION("file_path = %s, filepath_len = %d, ret_cpy = %d",
\r
244 file_path, strlen(file_path), ret_cpy);
\r
245 return DRM_RETURN_INVALID_ARG;
\r
248 req_data.fixed_data.permission_type = perm_type;
\r
250 /* Tell the server which API to be used */
\r
251 req_data.fixed_data.api_name = DRM_GET_LICENSE_STATUS;
\r
253 /* Send Data to DRM server */
\r
254 /* Call the Client Communication API */
\r
255 if ((ret_comm = drm_client_comm(&req_data, &resp_data)) != 0) {
\r
256 DRM_CLIENT_EXCEPTION("drm_client_comm error!!, ret_comm = %d", ret_comm);
\r
257 result = DRM_RETURN_COMMUNICATION_ERROR;
\r
261 /* Copy the response obtained from the server into the output parameter */
\r
262 if (resp_data.fixed_data.resp_result != 0) {
\r
263 DRM_CLIENT_EXCEPTION("Error returned from server!!, resp_data.fixed_data.resp_result = 0x%x",
\r
264 resp_data.fixed_data.resp_result);
\r
265 *license_status = DRM_LICENSE_STATUS_UNDEFINED;
\r
266 result = resp_data.fixed_data.resp_result;
\r
269 DRM_CLIENT_LOG("resp_data.fixed_data.resp_result = 0x%x", resp_data.fixed_data.resp_result);
\r
270 *license_status = resp_data.fixed_data.lic_status;
\r
273 DRM_CLIENT_LOG("*license_status = %d", *license_status);
\r
276 if (result != DRM_RETURN_SUCCESS) {
\r
277 DRM_CLIENT_EXCEPTION("Exit:failed!!, result = 0x%x", result);
\r
279 DRM_CLIENT_LOG("Exit:Success!!, result = 0x%x", result);
\r
286 * An application can get DRM Content information for the file
\r
287 * specified in file_path.
\r
289 * @param[in] file_path DRM file path.
\r
290 * @param[out] content_info Content information.
\r
291 * @return 0 on success, else a negative error value
\r
292 * @retval DRM_RETURN_SUCCESS on success
\r
293 * @retval DRM_RETURN_INVALID_ARG if arguments are invalid
\r
294 * @retval DRM_RETURN_COMMUNICATION_ERROR if socket error
\r
295 * @retval DRM_RETURN_INTERNAL_ERROR if operation error
\r
300 EXPORT_API int drm_get_content_info(const char *file_path,
\r
301 drm_content_info_s *content_info)
\r
303 DRM_CLIENT_LOG("Enter: file_path = %s", (!file_path) ? NULL:file_path);
\r
305 drm_request_data_s req_data;
\r
306 drm_response_data_s resp_data;
\r
308 drm_result_e result = DRM_RETURN_SUCCESS;
\r
311 /* memset the structures */
\r
312 memset(&req_data, 0x0, sizeof(drm_request_data_s));
\r
313 memset(&resp_data, 0x0, sizeof(drm_response_data_s));
\r
315 /* Check input parameters */
\r
316 if (!file_path || '\0' == file_path[0] || !content_info) {
\r
317 DRM_CLIENT_EXCEPTION("Invalid Arg!!, file_path = %p, content_info = %p",
\r
318 file_path, content_info);
\r
319 return DRM_RETURN_INVALID_ARG;
\r
322 /* memset the output structure */
\r
323 memset(content_info, 0x00, sizeof(drm_content_info_s));
\r
325 /* Store the input parameters to the Request Data structure to be sent to server */
\r
326 if ((ret_cpy = g_strlcpy(req_data.fixed_data.request_data, file_path,
\r
327 DRM_MAX_LEN_FILEPATH)) >= DRM_MAX_LEN_FILEPATH) {
\r
328 DRM_CLIENT_EXCEPTION("file_path = %s, filepath_len = %d, ret_cpy = %d",
\r
329 file_path, strlen(file_path), ret_cpy);
\r
330 return DRM_RETURN_INVALID_ARG;
\r
333 /* Tell the server which API to be used */
\r
334 req_data.fixed_data.api_name = DRM_GET_CONTENT_INFO;
\r
336 /* Send Data to DRM server */
\r
337 /* Call the Client Communication API */
\r
338 if ((ret_comm = drm_client_comm(&req_data, &resp_data)) != 0) {
\r
339 DRM_CLIENT_EXCEPTION("drm_client_comm error!!, ret_comm = %d", ret_comm);
\r
340 result = DRM_RETURN_COMMUNICATION_ERROR;
\r
344 /* Copy the response obtained from the server into the output parameter */
\r
345 if (resp_data.fixed_data.resp_result != 0) {
\r
346 DRM_CLIENT_EXCEPTION("Error returned from server!!, resp_data.fixed_data.resp_result = 0x%x",
\r
347 resp_data.fixed_data.resp_result);
\r
348 memset(content_info, 0x00, sizeof(drm_content_info_s));
\r
349 result = resp_data.fixed_data.resp_result;
\r
352 DRM_CLIENT_LOG("resp_data.fixed_data.resp_result = 0x%x", resp_data.fixed_data.resp_result);
\r
353 memcpy(content_info, &resp_data.fixed_data.response_data, sizeof(drm_content_info_s));
\r
356 DRM_CLIENT_LOG("content_info->author = %s", content_info->author);
\r
357 DRM_CLIENT_LOG("content_info->content_id = %s", content_info->content_id);
\r
358 DRM_CLIENT_LOG("content_info->content_url = %s", content_info->content_url);
\r
359 DRM_CLIENT_LOG("content_info->copyright = %s", content_info->copyright);
\r
360 DRM_CLIENT_LOG("content_info->description = %s", content_info->description);
\r
361 DRM_CLIENT_LOG("content_info->icon_uri = %s", content_info->icon_uri);
\r
362 DRM_CLIENT_LOG("content_info->info_url = %s", content_info->info_url);
\r
363 DRM_CLIENT_LOG("content_info->mime_type = %s", content_info->mime_type);
\r
364 DRM_CLIENT_LOG("content_info->rights_url = %s", content_info->rights_url);
\r
365 DRM_CLIENT_LOG("content_info->title = %s", content_info->title);
\r
368 if (result != DRM_RETURN_SUCCESS) {
\r
369 DRM_CLIENT_EXCEPTION("Exit:failed!!, result = 0x%x", result);
\r
371 DRM_CLIENT_LOG("Exit:Success!!, result = 0x%x", result);
\r
378 * An application can get file information of a DRM file.
\r
380 * @param[in] file_path DRM file path.
\r
381 * @param[out] fileInfo DRM file info.
\r
382 * @return 0 on success, else a negative error value
\r
383 * @retval DRM_RETURN_SUCCESS on success
\r
384 * @retval DRM_RETURN_INVALID_ARG if arguments are invalid
\r
385 * @retval DRM_RETURN_COMMUNICATION_ERROR if socket error
\r
386 * @retval DRM_RETURN_INTERNAL_ERROR if operation error
\r
391 EXPORT_API int drm_get_file_info(const char *file_path,
\r
392 drm_file_info_s *fileInfo)
\r
394 DRM_CLIENT_LOG("Enter: file_path = %s", (!file_path) ? NULL:file_path);
\r
395 drm_request_data_s req_data;
\r
396 drm_response_data_s resp_data;
\r
398 drm_result_e result = DRM_RETURN_SUCCESS;
\r
401 /* memset the structures */
\r
402 memset(&req_data, 0x0, sizeof(drm_request_data_s));
\r
403 memset(&resp_data, 0x0, sizeof(drm_response_data_s));
\r
405 /* Check input parameters */
\r
406 if (!file_path || '\0' == file_path[0] || !fileInfo) {
\r
407 DRM_CLIENT_EXCEPTION("Invalid Arg!!, file_path = %p, fileInfo = %p",
\r
408 file_path, fileInfo);
\r
409 return DRM_RETURN_INVALID_ARG;
\r
412 DRM_CLIENT_LOG("file_path = %s", file_path);
\r
414 /* memset the output structure */
\r
415 memset(fileInfo, 0x00, sizeof(drm_file_info_s));
\r
417 /* Store the input parameters to the Request Data structure to be sent to server */
\r
418 if ((ret_cpy = g_strlcpy(req_data.fixed_data.request_data, file_path,
\r
419 DRM_MAX_LEN_FILEPATH)) >= DRM_MAX_LEN_FILEPATH) {
\r
420 DRM_CLIENT_EXCEPTION("file_path = %s, filepath_len = %d, ret_cpy = %d",
\r
421 file_path, strlen(file_path), ret_cpy);
\r
422 return DRM_RETURN_INVALID_ARG;
\r
425 /* Tell the server which API to be used */
\r
426 req_data.fixed_data.api_name = DRM_GET_FILE_INFO;
\r
428 /* Send Data to DRM server */
\r
429 /* Call the Client Communication API */
\r
430 if ((ret_comm = drm_client_comm(&req_data, &resp_data)) != 0) {
\r
431 DRM_CLIENT_EXCEPTION("drm_client_comm error!!, ret_comm = %d", ret_comm);
\r
432 result = DRM_RETURN_COMMUNICATION_ERROR;
\r
436 /* Copy the response obtained from the server into the output parameter */
\r
437 if (resp_data.fixed_data.resp_result != 0) {
\r
438 DRM_CLIENT_EXCEPTION("Error returned from server!!, resp_data.fixed_data.resp_result = 0x%x",
\r
439 resp_data.fixed_data.resp_result);
\r
440 memset(fileInfo, 0x00, sizeof(drm_file_info_s));
\r
441 result = resp_data.fixed_data.resp_result;
\r
444 DRM_CLIENT_LOG("resp_data.fixed_data.resp_result = 0x%x", resp_data.fixed_data.resp_result);
\r
445 memcpy(fileInfo, &resp_data.fixed_data.response_data, sizeof(drm_file_info_s));
\r
448 DRM_CLIENT_LOG("fileInfo->oma_info.method = %d", fileInfo->oma_info.method);
\r
449 DRM_CLIENT_LOG("fileInfo->oma_info.version = %d", fileInfo->oma_info.version);
\r
452 if (result != DRM_RETURN_SUCCESS) {
\r
453 DRM_CLIENT_EXCEPTION("Exit:failed!!, result = 0x%x", result);
\r
455 DRM_CLIENT_LOG("Exit:Success!!, result = 0x%x", result);
\r
461 * An application can get constraints associated with
\r
462 * given permission & given file
\r
464 * @param[in] file_path DRM file path.
\r
465 * @param[in] perm_type Enumeration type of permission.
\r
466 * @param[out] constraint_info Constraint info.
\r
467 * @return 0 on success, else a negative error value
\r
468 * @retval DRM_RETURN_SUCCESS on success
\r
469 * @retval DRM_RETURN_INVALID_ARG if arguments are invalid
\r
470 * @retval DRM_RETURN_COMMUNICATION_ERROR if socket error
\r
471 * @retval DRM_RETURN_INTERNAL_ERROR if operation error
\r
476 EXPORT_API int drm_get_constraint_info(const char *file_path,
\r
477 drm_permission_type_e perm_type,
\r
478 drm_constraint_info_s *constraint_info)
\r
480 DRM_CLIENT_LOG("Enter: file_path = %s, perm_type = %d",
\r
481 (!file_path) ? NULL:file_path, perm_type);
\r
483 drm_request_data_s req_data;
\r
484 drm_response_data_s resp_data;
\r
486 drm_result_e result = DRM_RETURN_SUCCESS;
\r
489 /* memset the structures */
\r
490 memset(&req_data, 0x0, sizeof(drm_request_data_s));
\r
491 memset(&resp_data, 0x0, sizeof(drm_response_data_s));
\r
493 /* Check input parameters */
\r
494 if (!file_path || '\0' == file_path[0] || !constraint_info) {
\r
495 DRM_CLIENT_EXCEPTION("Invalid Arg!!, file_path = %p, constraint_info = %p",
\r
496 file_path, constraint_info);
\r
497 return DRM_RETURN_INVALID_ARG;
\r
500 DRM_CLIENT_LOG("file_path = %s, perm_type = %d", file_path, perm_type);
\r
502 /* memset the output structure */
\r
503 memset(constraint_info, 0x00, sizeof(drm_constraint_info_s));
\r
505 /* Store the input parameters to the Request Data structure to be sent to server */
\r
506 if ((ret_cpy = g_strlcpy(req_data.fixed_data.request_data, file_path,
\r
507 DRM_MAX_LEN_FILEPATH)) >= DRM_MAX_LEN_FILEPATH) {
\r
508 DRM_CLIENT_EXCEPTION("file_path = %s, filepath_len = %d, ret_cpy = %d",
\r
509 file_path, strlen(file_path), ret_cpy);
\r
510 return DRM_RETURN_INVALID_ARG;
\r
512 req_data.fixed_data.permission_type = perm_type;
\r
514 /* Tell the server which API to be used */
\r
515 req_data.fixed_data.api_name = DRM_GET_CONSTRAINT_INFO;
\r
517 /* Send Data to DRM server */
\r
518 /* Call the Client Communication API */
\r
519 if ((ret_comm = drm_client_comm(&req_data, &resp_data)) != 0) {
\r
520 DRM_CLIENT_EXCEPTION("drm_client_comm error!!, ret_comm = %d", ret_comm);
\r
521 result = DRM_RETURN_COMMUNICATION_ERROR;
\r
525 /* Copy the response obtained from the server into the output parameter */
\r
526 if (resp_data.fixed_data.resp_result != 0) {
\r
527 DRM_CLIENT_EXCEPTION("Error returned from server!!, resp_data.fixed_data.resp_result = 0x%x",
\r
528 resp_data.fixed_data.resp_result);
\r
529 memset(constraint_info, 0x00, sizeof(drm_constraint_info_s));
\r
530 result = resp_data.fixed_data.resp_result;
\r
533 DRM_CLIENT_LOG("resp_data.fixed_data.resp_result = 0x%x", resp_data.fixed_data.resp_result);
\r
534 memcpy(constraint_info, &resp_data.fixed_data.response_data, sizeof(drm_constraint_info_s));
\r
538 if (result != DRM_RETURN_SUCCESS) {
\r
539 DRM_CLIENT_EXCEPTION("Exit:failed!!, result = 0x%x", result);
\r
541 DRM_CLIENT_LOG("Exit:Success!!, result = 0x%x", result);
\r
547 * An application can check the feasibility of actions to be
\r
548 * performed based on the type of DRM file.
\r
550 * @param[in] action Action to be taken.
\r
551 * @param[in] action_data Data needed to check action
\r
552 * allowed operation
\r
553 * @param[out] is_allowed DRM_TRUE if action is allowed
\r
555 * @return 0 on success, else a negative error value
\r
556 * @retval DRM_RETURN_SUCCESS on success
\r
557 * @retval DRM_RETURN_INVALID_ARG if arguments are invalid
\r
558 * @retval DRM_RETURN_COMMUNICATION_ERROR if socket error
\r
559 * @retval DRM_RETURN_INTERNAL_ERROR if operation error
\r
564 EXPORT_API int drm_is_action_allowed(drm_action_type_e action,
\r
565 drm_action_allowed_data_s *action_data,
\r
566 drm_bool_type_e *is_allowed)
\r
568 DRM_CLIENT_LOG("Enter: action = %d, action_data = %p", action, action_data);
\r
569 drm_request_data_s req_data;
\r
570 drm_response_data_s resp_data;
\r
572 drm_result_e result = DRM_RETURN_SUCCESS;
\r
574 /* memset the structures */
\r
575 memset(&req_data, 0x0, sizeof(drm_request_data_s));
\r
576 memset(&resp_data, 0x0, sizeof(drm_response_data_s));
\r
578 /* Check input parameters based on action type */
\r
580 case DRM_IS_FORWARDING_ALLOWED:
\r
581 case DRM_HAS_VALID_SETAS_STATUS:
\r
583 /* Check input parameters */
\r
584 if ((strlen(action_data->file_path)<=0) || !is_allowed) {
\r
585 DRM_CLIENT_EXCEPTION("Invalid Arg!!, action_data->file_path = %p,"
\r
586 " is_allowed = %p", action_data->file_path, is_allowed);
\r
587 return DRM_RETURN_INVALID_ARG;
\r
589 DRM_CLIENT_LOG("action_data->file_path = %s, action = %d, data = %d",
\r
590 action_data->file_path, action, action_data->data);
\r
592 /* Copy the input parameters to the Request structure */
\r
593 req_data.fixed_data.action = action;
\r
594 memcpy(req_data.fixed_data.request_data, action_data,
\r
595 sizeof(drm_action_allowed_data_s));
\r
599 case DRM_IS_DEVICE_ACTIVATED:
\r
600 case DRM_IS_VALID_SECURE_CLOCK:
\r
602 /* Check input parameters */
\r
604 DRM_CLIENT_EXCEPTION("Invalid Arg!!,is_allowed = %p",is_allowed);
\r
605 return DRM_RETURN_INVALID_ARG;
\r
608 /* Copy the input parameters to the Request structure */
\r
609 req_data.fixed_data.action = action;
\r
614 DRM_CLIENT_EXCEPTION("Invalid action type=%d",action);
\r
615 return DRM_RETURN_INVALID_ARG;
\r
618 /* Tell the server which API to be used */
\r
619 req_data.fixed_data.api_name = DRM_IS_ACTION_ALLOWED;
\r
621 /* Send Data to DRM server */
\r
622 /* Call the Client Communication API */
\r
623 if ((ret_comm = drm_client_comm(&req_data, &resp_data)) != 0) {
\r
624 DRM_CLIENT_EXCEPTION("drm_client_comm error!!, ret_comm = %d", ret_comm);
\r
625 result = DRM_RETURN_COMMUNICATION_ERROR;
\r
629 /* Copy the response obtained from the server into the output parameter */
\r
630 if (resp_data.fixed_data.resp_result != 0) {
\r
631 DRM_CLIENT_EXCEPTION("Error returned from server!!, resp_data.fixed_data.resp_result = 0x%x",
\r
632 resp_data.fixed_data.resp_result);
\r
633 *is_allowed = DRM_FALSE;
\r
634 result = resp_data.fixed_data.resp_result;
\r
637 DRM_CLIENT_LOG("resp_data.fixed_data.resp_result = 0x%x", resp_data.fixed_data.resp_result);
\r
638 *is_allowed = resp_data.fixed_data.bool_val;
\r
642 if (result != DRM_RETURN_SUCCESS) {
\r
643 DRM_CLIENT_EXCEPTION("Exit:failed!!, result = 0x%x", result);
\r
645 DRM_CLIENT_LOG("Exit:Success!!, result = 0x%x", result);
\r
651 * An application can get the requested data from DRM.
\r
653 * @param[in] data_type Data types as per enum drm_data_type_e.
\r
654 * @param[in] input Pointer to appropriate structure as per data_type.
\r
655 * @param[out] output Output data. Pointer to appropriate structure as
\r
658 * @return 0 on success, else a negative error value
\r
659 * @retval DRM_RETURN_SUCCESS on success
\r
660 * @retval DRM_RETURN_INVALID_ARG if arguments are invalid
\r
661 * @retval DRM_RETURN_COMMUNICATION_ERROR if socket error
\r
662 * @retval DRM_RETURN_INTERNAL_ERROR if operation error
\r
663 * @remarks Please typecast to appropriate data structures
\r
664 * as per data types.
\r
666 * if data_type = DRM_DATA_TYPE_SECURE_CLOCK
\r
667 * then input type: input = NULL
\r
668 * and output type: output = pointer to struct
\r
669 * drm_secure_clock_data_s
\r
671 * if data_type = DRM_DATA_TYPE_TRANSACTION_TRACKING_FLAG
\r
672 * then input type: input = NULL
\r
673 * and output type: output = pointer to int
\r
675 * if data_type = DRM_DATA_TYPE_TRANSACTION_TRACKING_ID
\r
676 * then input type: input = pointer to file path (const char)
\r
677 * and output type: output = pointer to struct
\r
678 * drm_transaction_id_info_s
\r
680 * if data_type = DRM_DATA_TYPE_DIVX_REGISTRATION_CODE
\r
681 * then input type: input = NULL
\r
682 * and output type: output = pointer to struct drm_code_info_s
\r
684 * if data_type = DRM_DATA_TYPE_DIVX_DEREGISTRATION_CODE
\r
685 * then input type: input = NULL
\r
686 * and output type: output = pointer to struct drm_code_info_s
\r
691 EXPORT_API int drm_get_data(drm_data_type_e data_type, void *input, void *output)
\r
693 DRM_CLIENT_LOG("Enter: data_type = %d, input = %p, output = %p",
\r
694 data_type, input, output);
\r
695 /* Local Variables */
\r
696 drm_result_e result = DRM_RETURN_SUCCESS;
\r
697 drm_request_data_s req_data;
\r
698 drm_response_data_s resp_data;
\r
702 /* memset the structures */
\r
703 memset(&req_data, 0x0, sizeof(drm_request_data_s));
\r
704 memset(&resp_data, 0x0, sizeof(drm_response_data_s));
\r
706 /* Check Input & Output Parameters and fill the Request data */
\r
707 switch (data_type) {
\r
708 case DRM_DATA_TYPE_SECURE_CLOCK:
\r
709 case DRM_DATA_TYPE_TRANSACTION_TRACKING_FLAG:
\r
710 case DRM_DATA_TYPE_DIVX_REGISTRATION_CODE:
\r
711 case DRM_DATA_TYPE_DIVX_DEREGISTRATION_CODE:
\r
713 DRM_CLIENT_EXCEPTION("Invalid arguments!!, output = %p", output);
\r
714 return DRM_RETURN_INVALID_ARG;
\r
717 case DRM_DATA_TYPE_TRANSACTION_TRACKING_ID: {
\r
718 if (!input || ((char*)input)[0] == '\0' || !output) {
\r
719 DRM_CLIENT_EXCEPTION("Invalid arguments!!, input = %p, output = %p",
\r
721 return DRM_RETURN_INVALID_ARG;
\r
724 /* Copy the input parameter to be sent as Request Data */
\r
725 if ((ret_cpy = g_strlcpy(req_data.fixed_data.request_data,
\r
726 (const gchar*) input, DRM_MAX_LEN_FILEPATH))
\r
727 >= DRM_MAX_LEN_FILEPATH) {
\r
728 DRM_CLIENT_EXCEPTION("file_path = %s, filepath_len = %d, ret_cpy = %d",
\r
729 (const char*)input, strlen(((const char*)input)), ret_cpy);
\r
730 return DRM_RETURN_INVALID_ARG;
\r
735 DRM_CLIENT_EXCEPTION("Invalid argument, data_type = %d", data_type);
\r
736 return DRM_RETURN_INVALID_ARG;
\r
739 DRM_CLIENT_LOG("data_type=%d input=%p output=%p", data_type, input, output);
\r
741 /* Fill other parameters to be sent */
\r
742 req_data.fixed_data.data_type = data_type;
\r
744 /* Tell the server which API to be used */
\r
745 req_data.fixed_data.api_name = DRM_GET_DATA;
\r
747 /* Send Data to DRM server */
\r
748 /* Call the Client Communication API */
\r
749 if ((ret_comm = drm_client_comm(&req_data, &resp_data)) != 0) {
\r
750 DRM_CLIENT_EXCEPTION("drm_client_comm error!!, ret_comm = %d", ret_comm);
\r
751 result = DRM_RETURN_COMMUNICATION_ERROR;
\r
755 /* Copy the response obtained from the server into the output parameter */
\r
756 if (resp_data.fixed_data.resp_result != 0) {
\r
757 DRM_CLIENT_EXCEPTION("Error returned from server!!, resp_data.fixed_data.resp_result = 0x%x",
\r
758 resp_data.fixed_data.resp_result);
\r
760 result = resp_data.fixed_data.resp_result;
\r
763 DRM_CLIENT_LOG("resp_data.fixed_data.resp_result = 0x%x", resp_data.fixed_data.resp_result);
\r
765 /* Store the response result to the output based on the request data type */
\r
766 switch (data_type) {
\r
768 case DRM_DATA_TYPE_SECURE_CLOCK: {
\r
769 drm_secure_clock_data_s sec_clk_data = { 0, };
\r
771 /* Copy from response data into local structure */
\r
772 memcpy(&sec_clk_data, resp_data.fixed_data.response_data,
\r
773 sizeof(drm_secure_clock_data_s));
\r
774 DRM_CLIENT_LOG("sec_clk_data.is_secure_clock_set = %d",
\r
775 sec_clk_data.is_secure_clock_set);
\r
776 DRM_CLIENT_LOG("Year=%d,Month=%d,Day=%d,Hour=%d, minute=%d, Second=%d",
\r
777 sec_clk_data.secure_clock.tm_year,
\r
778 sec_clk_data.secure_clock.tm_mon,
\r
779 sec_clk_data.secure_clock.tm_mday,
\r
780 sec_clk_data.secure_clock.tm_hour,
\r
781 sec_clk_data.secure_clock.tm_min,
\r
782 sec_clk_data.secure_clock.tm_sec);
\r
784 /* Now copy into output parameter */
\r
785 memcpy(output, &sec_clk_data, sizeof(drm_secure_clock_data_s));
\r
790 case DRM_DATA_TYPE_TRANSACTION_TRACKING_FLAG: {
\r
792 int transtrack_flag = 0;
\r
794 /* Copy from response data into local structure */
\r
795 memcpy(&transtrack_flag, resp_data.fixed_data.response_data, sizeof(int));
\r
796 DRM_CLIENT_LOG("transtrack_flag = %d", transtrack_flag);
\r
798 /* Now copy into output parameter */
\r
799 memcpy(output, &transtrack_flag, sizeof(int));
\r
804 case DRM_DATA_TYPE_TRANSACTION_TRACKING_ID: {
\r
805 drm_transaction_id_info_s transid_info;
\r
806 memset(&transid_info,0,sizeof(transid_info));
\r
808 /* Copy from response data into local structure */
\r
809 memcpy(&transid_info, resp_data.fixed_data.response_data,
\r
810 sizeof(drm_transaction_id_info_s));
\r
811 DRM_CLIENT_LOG("transid_info.tr_id = %s", transid_info.tr_id);
\r
812 DRM_CLIENT_LOG("transid_info.tr_id_len = %d",
\r
813 transid_info.tr_id_len)
\r
815 /* Now copy into output parameter */
\r
816 memcpy(output, &transid_info, sizeof(drm_transaction_id_info_s));
\r
821 case DRM_DATA_TYPE_DIVX_REGISTRATION_CODE: {
\r
823 drm_code_info_s registration_info;
\r
824 memset(®istration_info,0,sizeof(registration_info));
\r
826 /* Copy from response data into local structure */
\r
827 memcpy(®istration_info, resp_data.fixed_data.response_data,
\r
828 sizeof(drm_code_info_s));
\r
829 DRM_CLIENT_LOG("registration_info.code = %s",
\r
830 registration_info.code);
\r
831 DRM_CLIENT_LOG("registration_info.code_len = %d",
\r
832 registration_info.code_len);
\r
834 /* Now copy into output parameter */
\r
835 memcpy(output, ®istration_info, sizeof(drm_code_info_s));
\r
840 case DRM_DATA_TYPE_DIVX_DEREGISTRATION_CODE: {
\r
842 drm_code_info_s deregis_info;
\r
843 memset(&deregis_info,0,sizeof(deregis_info));
\r
845 /* Copy from response data into local structure */
\r
846 memcpy(&deregis_info, resp_data.fixed_data.response_data,
\r
847 sizeof(drm_code_info_s));
\r
848 DRM_CLIENT_LOG("deregis_info.code = %s",
\r
849 deregis_info.code);
\r
850 DRM_CLIENT_LOG("deregis_info.code_len = %d",
\r
851 deregis_info.code_len);
\r
853 /* Now copy into output parameter */
\r
854 memcpy(output, &deregis_info, sizeof(drm_code_info_s));
\r
864 DRM_CLIENT_LOG("Exit:Success:result=0x%x",result);
\r
869 DRM_CLIENT_EXCEPTION("Exit:failed:result=0x%x",result);
\r
874 * An application can do particular request to DRM.
\r
876 * @param[in] request_type Request types as per enum drm_request_type_e.
\r
877 * @param[in] input Pointer to appropriate structure as per
\r
879 * @param[out] output Output data. Pointer to appropriate structure as
\r
880 * per request_type.
\r
882 * @return 0 on success, else a negative error value
\r
883 * @retval DRM_RETURN_SUCCESS on success
\r
884 * @retval DRM_RETURN_INVALID_ARG if arguments are invalid
\r
885 * @retval DRM_RETURN_COMMUNICATION_ERROR if socket error
\r
886 * @retval DRM_RETURN_INTERNAL_ERROR if operation error
\r
887 * @remarks Please typecast to appropriate data structures
\r
888 * as per data types.
\r
890 * if request_type = DRM_REQUEST_TYPE_REGISTER_FILE
\r
891 * then input type: input = pointer to const char (file_path)
\r
892 * and output type: output = NULL
\r
894 * if request_type = DRM_REQUEST_TYPE_UNREGISTER_FILE
\r
895 * then input type: input = pointer to struct drm_unregister_info_s
\r
896 * and output type: output = NULL
\r
898 * if request_type = DRM_REQUEST_TYPE_UNREGISTER_ALL_FILES
\r
899 * then input type: input = NULL
\r
900 * and output type: output = NULL
\r
902 * if request_type = DRM_REQUEST_TYPE_REGISTER_LICENSE
\r
903 * then input type: input = pointer to
\r
904 * struct drm_register_lic_info_s.
\r
905 * and output type: output = pointer to
\r
906 * struct drm_register_lic_resp_s.
\r
908 * if request_type = DRM_REQUEST_TYPE_SUBMIT_INITIATOR_URL
\r
909 * then input type: input = pointer to struct drm_initiator_info_s
\r
910 * and output type: output = pointer to struct drm_web_server_resp_data_s
\r
912 * if request_type = DRM_REQUEST_TYPE_SUBMIT_ROAP_MESSAGE
\r
913 * then input type: input = pointer to struct drm_submit_roap_message_info_s
\r
914 * and output type: output = NULL
\r
916 * if request_type = DRM_REQUEST_TYPE_SUBMIT_ROAP_USER_CONSENT
\r
917 * then input type: input = pointer to struct drm_submit_roap_user_consent_info_s
\r
918 * and output type: output = NULL
\r
920 * if request_type = DRM_REQUEST_TYPE_HTTP_USER_CANCEL
\r
921 * then input type: input = pointer to struct drm_http_user_cancel_info_s
\r
922 * and output type: output = NULL
\r
924 * if request_type = DRM_REQUEST_TYPE_REGISTER_COPY_FILE
\r
925 * then input type: input = pointer to struct drm_register_copy_file_info_s
\r
926 * and output type: output = NULL
\r
928 * if request_type = DRM_REQUEST_TYPE_REGISTER_MOVE_FILE
\r
929 * then input type: input = pointer to struct drm_register_copy_file_info_s
\r
930 * and output type: output = NULL
\r
932 * if request_type = DRM_REQUEST_TYPE_INSERT_EXT_MEMORY
\r
933 * then input type: input = NULL
\r
934 * and output type: output = NULL
\r
936 * if request_type = DRM_REQUEST_TYPE_EXTRACT_EXT_MEMORY
\r
937 * then input type: input = NULL
\r
938 * and output type: output = NULL
\r
940 * if request_type = DRM_REQUEST_TYPE_REGISTER_SETAS
\r
941 * then input type: input = pointer to struct drm_register_setas_info_s
\r
942 * and output type: output = pointer to the struct drm_register_setas_resp_data_s
\r
944 * if request_type = DRM_REQUEST_TYPE_UNREGISTER_SETAS
\r
945 * then input type: input = pointer to struct drm_unregister_setas_info_s
\r
946 * and output type: output = NULL
\r
951 EXPORT_API int drm_process_request(drm_request_type_e request_type,
\r
952 void *input, void *output)
\r
954 DRM_CLIENT_LOG("Enter: request_type = %d, input = %p, output = %p",
\r
955 request_type, input, output);
\r
956 /* Local Variables */
\r
957 drm_result_e result = DRM_RETURN_SUCCESS;
\r
958 drm_request_data_s req_data;
\r
959 drm_response_data_s resp_data;
\r
963 /* memset the structures */
\r
964 memset(&req_data, 0x0, sizeof(drm_request_data_s));
\r
965 memset(&resp_data, 0x0, sizeof(drm_response_data_s));
\r
967 DRM_CLIENT_LOG("request_type = %d", request_type);
\r
969 /* Check Input & Output Parameters */
\r
970 switch (request_type) {
\r
971 case DRM_REQUEST_TYPE_REGISTER_FILE: {
\r
972 if (!input || ((char*)input)[0] == '\0') {
\r
973 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p", input);
\r
974 return DRM_RETURN_INVALID_ARG;
\r
976 /* Copy the input to Request Structure */
\r
977 if ((ret_cpy = g_strlcpy(req_data.fixed_data.request_data,
\r
978 (const gchar*) input, DRM_MAX_LEN_FILEPATH))
\r
979 >= DRM_MAX_LEN_FILEPATH) {
\r
980 DRM_CLIENT_EXCEPTION("file_path = %s, filepath_len = %d, ret_cpy = %d",
\r
981 (const char*)input, strlen(((const char*)input)), ret_cpy);
\r
982 return DRM_RETURN_INVALID_ARG;
\r
988 case DRM_REQUEST_TYPE_UNREGISTER_FILE: {
\r
989 if (!input || ((char*)input)[0] == '\0') {
\r
990 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p", input);
\r
991 return DRM_RETURN_INVALID_ARG;
\r
993 /* Copy the input to Request Structure */
\r
994 memcpy(req_data.fixed_data.request_data, input, sizeof(drm_unregister_info_s));
\r
999 case DRM_REQUEST_TYPE_UNREGISTER_ALL_FILES: {
\r
1000 DRM_CLIENT_LOG("No parameters required!");
\r
1004 case DRM_REQUEST_TYPE_REGISTER_LICENSE: {
\r
1005 if (!input || ((char*)input)[0] == '\0' || !output) {
\r
1006 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p, output = %p",
\r
1008 return DRM_RETURN_INVALID_ARG;
\r
1010 /* Copy the input to Request Structure */
\r
1011 memcpy(req_data.fixed_data.request_data, input,
\r
1012 sizeof(drm_register_lic_info_s));
\r
1018 case DRM_REQUEST_TYPE_SUBMIT_INITIATOR_URL: {
\r
1019 if (!input || ((char*)input)[0] == '\0' || !output) {
\r
1020 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p, output = %p",
\r
1022 return DRM_RETURN_INVALID_ARG;
\r
1025 DRM_CLIENT_LOG("initiator_url[%s]", ((drm_initiator_info_s*)input)->initiator_url);
\r
1026 DRM_CLIENT_LOG("initiator_url_len[%u]", ((drm_initiator_info_s*)input)->initiator_url_len);
\r
1027 DRM_CLIENT_LOG("operation_callback.callback[%p]", ((drm_initiator_info_s*)input)->operation_callback.callback);
\r
1028 DRM_CLIENT_LOG("init_type[%d]", ((drm_initiator_info_s*)input)->init_type);
\r
1029 DRM_CLIENT_LOG("custom_data.app_id[%s]", ((drm_initiator_info_s*)input)->custom_data.app_id);
\r
1030 DRM_CLIENT_LOG("custom_data.user_guid[%s]", ((drm_initiator_info_s*)input)->custom_data.user_guid);
\r
1031 DRM_CLIENT_LOG("custom_data.device_id[%s]", ((drm_initiator_info_s*)input)->custom_data.device_id);
\r
1032 DRM_CLIENT_LOG("custom_data.order_id[%s]", ((drm_initiator_info_s*)input)->custom_data.order_id);
\r
1033 DRM_CLIENT_LOG("custom_data.service_id[%s]", ((drm_initiator_info_s*)input)->custom_data.service_id);
\r
1034 DRM_CLIENT_LOG("custom_data.account_id[%s]", ((drm_initiator_info_s*)input)->custom_data.account_id);
\r
1036 /* Copy the input to Request Structure */
\r
1037 memcpy(req_data.fixed_data.request_data, input,
\r
1038 sizeof(drm_initiator_info_s));
\r
1043 case DRM_REQUEST_TYPE_SUBMIT_ROAP_MESSAGE: {
\r
1046 || (!((drm_submit_roap_message_info_s*) input)->buffer)
\r
1047 || (((drm_submit_roap_message_info_s*) input)->buffer[0] == '\0')
\r
1048 || (((drm_submit_roap_message_info_s*) input)->buff_size == 0)) {
\r
1049 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p", input);
\r
1050 return DRM_RETURN_INVALID_ARG;
\r
1053 /* Copy the input to Request Structure */
\r
1054 memcpy(req_data.fixed_data.request_data, input,
\r
1055 sizeof(drm_submit_roap_message_info_s));
\r
1057 /* Number of additional data items to be sent */
\r
1058 if ((((drm_submit_roap_message_info_s*) input)->app_session_data.pData)
\r
1059 && (((drm_submit_roap_message_info_s*) input)->app_session_data.size_pData != 0)) {
\r
1060 req_data.fixed_data.num_data_items = 2;
\r
1062 req_data.fixed_data.num_data_items = 1;
\r
1065 /* Fill details pertaining to additional pointers to be sent */
\r
1066 req_data.fixed_data.data_length[0] =
\r
1067 ((drm_submit_roap_message_info_s*) input)->buff_size;
\r
1069 /* Allocate memory for data items */
\r
1070 req_data.data_items[0] = (char*) malloc(
\r
1071 req_data.fixed_data.data_length[0]);
\r
1072 if (!req_data.data_items[0]) {
\r
1073 DRM_CLIENT_EXCEPTION("Memory Allocation Error!, Buf = %p",
\r
1074 req_data.data_items[0]);
\r
1075 result = DRM_RETURN_INSUFFICIENT_MEMORY;
\r
1079 /* Copy the buffer into data items */
\r
1080 memcpy(req_data.data_items[0],
\r
1081 ((drm_submit_roap_message_info_s*) input)->buffer,
\r
1082 ((drm_submit_roap_message_info_s*) input)->buff_size);
\r
1084 if (2 == req_data.fixed_data.num_data_items) {
\r
1085 req_data.fixed_data.data_length[1] =
\r
1086 ((drm_submit_roap_message_info_s*) input)->app_session_data.size_pData;
\r
1088 req_data.data_items[1] = (char*) malloc(
\r
1089 req_data.fixed_data.data_length[1]);
\r
1090 if (!req_data.data_items[1]) {
\r
1091 DRM_CLIENT_EXCEPTION("Memory Allocation Error!, Buf = %p",
\r
1092 req_data.data_items[1]);
\r
1093 result = DRM_RETURN_INSUFFICIENT_MEMORY;
\r
1097 /* Copy the Additional data */
\r
1098 memcpy( req_data.data_items[1],
\r
1099 ((drm_submit_roap_message_info_s*) input)->app_session_data.pData,
\r
1100 ((drm_submit_roap_message_info_s*) input)->app_session_data.size_pData);
\r
1107 case DRM_REQUEST_TYPE_SUBMIT_ROAP_USER_CONSENT: {
\r
1110 || (!((drm_submit_roap_user_consent_info_s*) input)->agentdata)
\r
1111 || (((drm_submit_roap_user_consent_info_s*) input)->size_agentdata == 0)) {
\r
1112 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p", input);
\r
1113 return DRM_RETURN_INVALID_ARG;
\r
1116 /* Copy the input to Request Structure */
\r
1117 memcpy(req_data.fixed_data.request_data, input,
\r
1118 sizeof(drm_submit_roap_user_consent_info_s));
\r
1120 /* Number of additional data items to be sent */
\r
1121 req_data.fixed_data.num_data_items = 1;
\r
1123 /* Fill details pertaining to additional pointers to be sent */
\r
1124 req_data.fixed_data.data_length[0] =
\r
1125 ((drm_submit_roap_user_consent_info_s*) input)->size_agentdata;
\r
1127 /* Allocate memory for data items */
\r
1128 req_data.data_items[0] = (char*) malloc(
\r
1129 req_data.fixed_data.data_length[0]);
\r
1130 if (!req_data.data_items[0]) {
\r
1131 DRM_CLIENT_EXCEPTION("Memory Allocation Error!, Buf = %p",
\r
1132 req_data.data_items[0]);
\r
1133 result = DRM_RETURN_INSUFFICIENT_MEMORY;
\r
1137 /* Copy the buffer into data items */
\r
1138 memcpy(req_data.data_items[0],
\r
1139 ((drm_submit_roap_user_consent_info_s*) input)->agentdata,
\r
1140 ((drm_submit_roap_user_consent_info_s*) input)->size_agentdata);
\r
1146 case DRM_REQUEST_TYPE_HTTP_USER_CANCEL: {
\r
1149 || (!((drm_http_user_cancel_info_s*) input)->app_session_data)
\r
1150 || (((drm_http_user_cancel_info_s*) input)->size_app_session_data == 0)) {
\r
1151 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p", input);
\r
1152 return DRM_RETURN_INVALID_ARG;
\r
1155 /* Copy the input to Request Structure */
\r
1156 memcpy(req_data.fixed_data.request_data, input,
\r
1157 sizeof(drm_http_user_cancel_info_s));
\r
1159 /* Number of additional data items to be sent */
\r
1160 req_data.fixed_data.num_data_items = 1;
\r
1162 /* Fill details pertaining to additional pointers to be sent */
\r
1163 req_data.fixed_data.data_length[0] =
\r
1164 ((drm_http_user_cancel_info_s*) input)->size_app_session_data;
\r
1166 /* Allocate memory for data items */
\r
1167 req_data.data_items[0] = (char*) malloc(
\r
1168 req_data.fixed_data.data_length[0]);
\r
1169 if (!req_data.data_items[0]) {
\r
1170 DRM_CLIENT_EXCEPTION("Memory Allocation Error!, Buf = %p",
\r
1171 req_data.data_items[0]);
\r
1172 result = DRM_RETURN_INSUFFICIENT_MEMORY;
\r
1176 /* Copy the buffer into data items */
\r
1177 memcpy(req_data.data_items[0],
\r
1178 ((drm_http_user_cancel_info_s*) input)->app_session_data,
\r
1179 ((drm_http_user_cancel_info_s*) input)->size_app_session_data);
\r
1186 case DRM_REQUEST_TYPE_REGISTER_COPY_FILE: {
\r
1189 || (((drm_register_copy_file_info_s*) input)->src_file_path[0] == '\0')
\r
1190 || (((drm_register_copy_file_info_s*) input)->dest_file_path[0] == '\0')) {
\r
1191 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p", input);
\r
1192 return DRM_RETURN_INVALID_ARG;
\r
1195 /* Copy the input to Request Structure */
\r
1196 memcpy(req_data.fixed_data.request_data, input,
\r
1197 sizeof(drm_register_copy_file_info_s));
\r
1202 case DRM_REQUEST_TYPE_REGISTER_MOVE_FILE: {
\r
1205 || (((drm_register_move_file_info_s*) input)->src_file_path[0] == '\0')
\r
1206 || (((drm_register_move_file_info_s*) input)->dest_file_path[0] == '\0')) {
\r
1207 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p", input);
\r
1208 return DRM_RETURN_INVALID_ARG;
\r
1211 /* Copy the input to Request Structure */
\r
1212 memcpy(req_data.fixed_data.request_data, input,
\r
1213 sizeof(drm_register_move_file_info_s));
\r
1218 case DRM_REQUEST_TYPE_INSERT_EXT_MEMORY:
\r
1219 case DRM_REQUEST_TYPE_EXTRACT_EXT_MEMORY:
\r
1220 DRM_CLIENT_LOG("No parameters to check!!");
\r
1223 case DRM_REQUEST_TYPE_REGISTER_SETAS: {
\r
1226 || (((drm_register_setas_info_s*) input)->file_path[0] == '\0')) {
\r
1227 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p", input);
\r
1228 return DRM_RETURN_INVALID_ARG;
\r
1230 /* Copy the input to Request Structure */
\r
1231 memcpy(req_data.fixed_data.request_data, input,
\r
1232 sizeof(drm_register_setas_info_s));
\r
1238 case DRM_REQUEST_TYPE_UNREGISTER_SETAS: {
\r
1241 || (((drm_unregister_setas_info_s*) input)->file_path[0] == '\0')) {
\r
1242 DRM_CLIENT_EXCEPTION("Invalid argument!!, input = %p", input);
\r
1243 return DRM_RETURN_INVALID_ARG;
\r
1245 /* Copy the input to Request Structure */
\r
1246 memcpy(req_data.fixed_data.request_data, input,
\r
1247 sizeof(drm_unregister_setas_info_s));
\r
1253 DRM_CLIENT_EXCEPTION("Invalid Argument! request_type = %d",
\r
1255 return DRM_RETURN_INVALID_ARG;
\r
1258 DRM_CLIENT_LOG("input=%p output=%p", input, output);
\r
1260 /* Fill other parameters to be sent */
\r
1261 req_data.fixed_data.request_type = request_type;
\r
1263 /* Tell the server which API to be used */
\r
1264 req_data.fixed_data.api_name = DRM_PROCESS_REQUEST;
\r
1266 /* Send Data to DRM server */
\r
1267 /* Call the Client Communication API */
\r
1268 if ((ret_comm = drm_client_comm(&req_data, &resp_data)) != 0) {
\r
1269 DRM_CLIENT_EXCEPTION("drm_client_comm error!!, ret_comm = %d", ret_comm);
\r
1270 result = DRM_RETURN_COMMUNICATION_ERROR;
\r
1274 /* Copy the response obtained from the server into the output parameter */
\r
1275 if (resp_data.fixed_data.resp_result != 0) {
\r
1276 DRM_CLIENT_EXCEPTION("Error returned from server!!, resp_data.fixed_data.resp_result = 0x%x",
\r
1277 resp_data.fixed_data.resp_result);
\r
1279 result = resp_data.fixed_data.resp_result;
\r
1282 DRM_CLIENT_LOG("resp_data.fixed_data.resp_result = 0x%x", resp_data.fixed_data.resp_result);
\r
1284 /* Store the response result to the output based on the Request type */
\r
1285 switch (request_type) {
\r
1286 case DRM_REQUEST_TYPE_SUBMIT_INITIATOR_URL: {
\r
1288 drm_web_server_resp_data_s ws_resp_data;
\r
1289 memset(&ws_resp_data,0,sizeof(ws_resp_data));
\r
1290 /* Copy from response data into local structure */
\r
1291 memcpy(&ws_resp_data, resp_data.fixed_data.response_data,
\r
1292 sizeof(drm_web_server_resp_data_s));
\r
1293 DRM_CLIENT_LOG("ws_resp_data.fixed_data.content_url = %s",
\r
1294 ws_resp_data.content_url);
\r
1295 DRM_CLIENT_LOG("ws_resp_data.result_code = 0x%x",
\r
1296 ws_resp_data.result_code);
\r
1298 /* Now copy into output parameter */
\r
1299 memcpy(output, &ws_resp_data, sizeof(drm_web_server_resp_data_s));
\r
1304 case DRM_REQUEST_TYPE_REGISTER_LICENSE: {
\r
1306 drm_register_lic_resp_s lic_resp;
\r
1307 memset(&lic_resp,0,sizeof(lic_resp));
\r
1309 /* Copy from response data into local structure */
\r
1310 memcpy(&lic_resp, resp_data.fixed_data.response_data,
\r
1311 sizeof(drm_register_lic_resp_s));
\r
1312 DRM_CLIENT_LOG("lic_resp.cid = %s", lic_resp.cid);
\r
1314 /* Now copy into output parameter */
\r
1315 memcpy(output, &lic_resp, sizeof(drm_register_lic_resp_s));
\r
1320 case DRM_REQUEST_TYPE_REGISTER_SETAS: {
\r
1322 DRM_CLIENT_LOG("Register Setas Successful");
\r
1323 drm_register_setas_resp_data_s setas_resp = { 0, };
\r
1325 /* Copy from response data into local structure */
\r
1326 memcpy(&setas_resp, resp_data.fixed_data.response_data,
\r
1327 sizeof(drm_register_setas_resp_data_s));
\r
1329 /* Now copy into output parameter */
\r
1330 memcpy(output, &setas_resp, sizeof(drm_register_setas_resp_data_s));
\r
1333 case DRM_REQUEST_TYPE_REGISTER_FILE:
\r
1334 case DRM_REQUEST_TYPE_UNREGISTER_FILE:
\r
1335 case DRM_REQUEST_TYPE_UNREGISTER_ALL_FILES:
\r
1336 case DRM_REQUEST_TYPE_SUBMIT_ROAP_MESSAGE:
\r
1337 case DRM_REQUEST_TYPE_SUBMIT_ROAP_USER_CONSENT:
\r
1338 case DRM_REQUEST_TYPE_HTTP_USER_CANCEL:
\r
1339 case DRM_REQUEST_TYPE_REGISTER_COPY_FILE:
\r
1340 case DRM_REQUEST_TYPE_REGISTER_MOVE_FILE:
\r
1341 case DRM_REQUEST_TYPE_INSERT_EXT_MEMORY:
\r
1342 case DRM_REQUEST_TYPE_EXTRACT_EXT_MEMORY:
\r
1343 case DRM_REQUEST_TYPE_UNREGISTER_SETAS:
\r
1344 DRM_CLIENT_LOG("No output parameters to be handled!!");
\r
1353 /* Free Request Data memory */
\r
1354 for (unsigned int i = 0; i < req_data.fixed_data.num_data_items; i++) {
\r
1355 if (req_data.data_items[i])
\r
1356 free(req_data.data_items[i]);
\r
1359 /* Free Response Data memory */
\r
1360 for (unsigned int i = 0; i < resp_data.fixed_data.num_data_items; i++) {
\r
1361 if (resp_data.data_items[i])
\r
1362 free(resp_data.data_items[i]);
\r
1365 DRM_CLIENT_LOG("Result[0x%x]", result);
\r
1371 * Private function
\r
1374 * @param[in] file_path Specifies the pointer points a DRM file path.
\r
1375 * @return This function returns DRM file type.
\r
1380 static drm_file_type_e _drm_client_get_file_type(const char* file_path)
\r
1383 p = (char *) strrchr(file_path, '.');
\r
1385 DRM_CLIENT_EXCEPTION("Invalid file_path!, file_path = %s", file_path);
\r
1386 return DRM_TYPE_UNDEFINED;
\r
1389 DRM_CLIENT_LOG("file_path=[%s], p=[0x%x]", file_path, p);
\r
1391 if (p && ((strncasecmp(p, ".dcf", 4) == 0))) {
\r
1393 DRM_CLIENT_LOG("OMA DRM V1 File: file_path=%s p=%s", file_path, p);
\r
1394 return DRM_TYPE_OMA_V1;
\r
1396 } else if (p && ((strncasecmp(p, ".odf", 4) == 0)
\r
1397 || (strncasecmp(p, ".o4a", 4) == 0)
\r
1398 || (strncasecmp(p, ".o4v", 4) == 0))) {
\r
1400 DRM_CLIENT_LOG("OMA DRM V2 File: file_path=%s p=%s", file_path, p);
\r
1401 return DRM_TYPE_OMA_V2;
\r
1403 } else if ((p && ((strncasecmp(p, ".pya", 4) == 0)
\r
1404 || (strncasecmp(p, ".pyv", 4) == 0)))) {
\r
1406 DRM_CLIENT_LOG("PlayReady File: file_path=%s p=%s", file_path, p);
\r
1407 return DRM_TYPE_PLAYREADY;
\r
1409 } else if (p && ((strncasecmp(p, ".eny", 4) == 0)
\r
1410 || (strncasecmp(p, ".pye", 4) == 0)
\r
1411 || (strncasecmp(p, ".jue", 4) == 0))) {
\r
1413 DRM_CLIENT_LOG("PlayReady Envelope File: file_path=%s p=%s", file_path, p);
\r
1414 return DRM_TYPE_PLAYREADY_ENVELOPE;
\r
1416 } else if (p && ((strncasecmp(p, ".avi", 4) == 0)
\r
1417 || (strncasecmp(p, ".divx", 5) == 0))) {
\r
1419 DRM_CLIENT_LOG("DivX DRM File: file_path=%s p=%s", file_path, p);
\r
1420 return DRM_TYPE_DIVX;
\r
1423 DRM_CLIENT_LOG("NON DRM file=%s", file_path);
\r
1424 return DRM_TYPE_UNDEFINED;
\r