2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 /*==================================================================================================
19 *==================================================================================================*/
20 #include <metadata_extractor.h>
21 #include "msg-smil-content-manager.h"
22 #include "msg-smil-player.h"
24 /*==================================================================================================
25 * FUNCTION DECLARATIONS
26 *==================================================================================================*/
28 *@fn __msg_smil_content_mgr_create_page_content(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle, msg_struct_t *msgData);
29 *@brief This function creates the Slide Page Queue which is further passed to the UI for display.
30 *@return MSG_SUCCESS on success , else failure return code
31 *@param[in] msgData This is the message data
32 *@param[in] smilContMgrHndle The Content Manager Handler
35 static MSG_SMIL_ERROR_E __msg_smil_content_mgr_create_page_content(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle, msg_struct_t msg_info_t);
36 static SMIL_SLIDE_INFO_S *__msg_smil_content_mgr_create_mixed_message(msg_struct_t msg_info_t);
37 static SMIL_SLIDE_INFO_S *__msg_smil_content_mgr_create_related_message(msg_struct_t msg_info_t);
38 static SMIL_MASTER_SLIDE_INFO_S *__msg_smil_content_mgr_create_master_slide(msg_struct_t msg_info_t);
39 static void __msg_smil_content_mgr_free_slide_list(SMIL_SLIDE_INFO_S *deleteSlide);
40 static MSG_BOOL __msg_smil_cont_mgr_is_valid_slide(SMIL_MASTER_SLIDE_INFO_S *commonData, int curSlideIdx);
42 /*==================================================================================================
43 * FUNCTION IMPLEMENTATIONS
44 *================================================================================================*/
45 MSG_SMIL_ERROR_E _msg_smil_create_content_mgr(msg_struct_t msg_info_t, SMIL_CONTENT_MGR_HANDLE_S **smilContMgrHndle)
47 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
48 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, msg_info_t == NULL, MSG_ERR_SMIL_NULL_MESSAGE);
49 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, MSG_ERR_SMIL_INVALID_PARAMETER);
50 MSG_SMIL_ERROR_E err = MSG_ERR_SMIL_UNKNOWN;
52 /*allocate memory for the content mgr handler*/
53 *smilContMgrHndle = (SMIL_CONTENT_MGR_HANDLE_S *)calloc(1, sizeof(SMIL_CONTENT_MGR_HANDLE_S));
54 if (*smilContMgrHndle == NULL) {
55 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
56 return MSG_ERR_SMIL_INVALID_STORAGE;
59 /*create and set page content info.*/
60 err = __msg_smil_content_mgr_create_page_content(*smilContMgrHndle, msg_info_t);
61 if (err != MSG_SMIL_SUCCESS) {
62 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "__msg_smil_content_mgr_create_page_content is failed");
63 if (*smilContMgrHndle != NULL) {
64 free(*smilContMgrHndle);
65 *smilContMgrHndle = NULL;
71 //store mmsdata struct handler
72 (*smilContMgrHndle)->msg_info_t = msg_info_t;
74 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
75 return MSG_SMIL_SUCCESS;
78 static SMIL_MASTER_SLIDE_INFO_S *__msg_smil_content_mgr_create_master_slide(msg_struct_t msg_info_t)
80 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
81 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, msg_info_t == NULL, NULL);
82 SMIL_MASTER_SLIDE_INFO_S *commonData = NULL;
84 /*allocate master slide*/
85 commonData = (SMIL_MASTER_SLIDE_INFO_S *)calloc(1, sizeof(SMIL_MASTER_SLIDE_INFO_S));
86 if (commonData == NULL) {
87 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
91 msg_list_handle_t pagelist_info = NULL;
92 msg_get_list_handle(msg_info_t, MSG_MMS_PAGE_LIST_HND, (void **)&pagelist_info);
95 commonData->pageCnt = msg_list_length(pagelist_info);
97 /*Get Attachment List*/
98 msg_list_handle_t attachlist_info = NULL;
99 msg_get_list_handle(msg_info_t, MSG_MMS_ATTACH_LIST_HND, (void **)&attachlist_info);
100 commonData->attachCnt = msg_list_length(attachlist_info);
102 /*Get MetaData List*/
103 msg_list_handle_t metalist_info = NULL;
104 msg_get_list_handle(msg_info_t, MSG_MMS_META_LIST_HND, (void **)&metalist_info);
105 commonData->metaCnt = msg_list_length(metalist_info);
108 msg_list_handle_t regionlist_info = NULL;
109 msg_get_list_handle(msg_info_t, MSG_MMS_REGION_LIST_HND, (void **)®ionlist_info);
110 commonData->regionCnt = msg_list_length(regionlist_info);
112 /*Get Transition List */
113 msg_list_handle_t translist_info = NULL;
114 msg_get_list_handle(msg_info_t, MSG_MMS_TRANSITION_LIST_HND, (void **)&translist_info);
115 commonData->transitionCnt = msg_list_length(translist_info);
117 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
123 static SMIL_SLIDE_INFO_S *__msg_smil_content_mgr_create_mixed_message(msg_struct_t msg_info_t)
125 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
126 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, msg_info_t == NULL, NULL);
127 SMIL_SLIDE_INFO_S *newSlideContent = NULL;
130 MSG_BOOL isMixedMsg = FALSE;
131 msg_list_handle_t pagelist_info = NULL;
132 msg_list_handle_t attachlist_info = NULL;
134 msg_get_list_handle(msg_info_t, MSG_MMS_PAGE_LIST_HND, (void **)&pagelist_info);
135 pageCnt = msg_list_length(pagelist_info);
137 msg_get_list_handle(msg_info_t, MSG_MMS_ATTACH_LIST_HND, (void **)&attachlist_info);
138 attachCnt = msg_list_length(attachlist_info);
140 isMixedMsg = (pageCnt == 0) ? TRUE : FALSE;
143 newSlideContent = (SMIL_SLIDE_INFO_S *)calloc(1, sizeof(SMIL_SLIDE_INFO_S));
144 if (newSlideContent == NULL) {
145 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
149 newSlideContent->pageIdx = pageCnt;
150 newSlideContent->slideStatus = PLAYER_STATUS_NONE;
151 newSlideContent->nextSlide = NULL;
152 newSlideContent->prevSlide = NULL;
154 /* set pageinfo with no data*/
155 newSlideContent->pageInfo = (SMIL_PAGE_INFO_S *)calloc(1, sizeof(SMIL_PAGE_INFO_S));
156 if (newSlideContent->pageInfo == NULL) {
157 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
158 free(newSlideContent);
159 newSlideContent = NULL;
164 newSlideContent->pageInfo->mediaCnt = 0;
165 newSlideContent->pageInfo->isTexttop = FALSE;
166 newSlideContent->pageInfo->hasText = FALSE;
167 newSlideContent->pageInfo->hasImage = FALSE;
168 newSlideContent->pageInfo->hasVideo = FALSE;
169 newSlideContent->pageInfo->hasAudio = FALSE;
170 newSlideContent->pageInfo->pageDuration = MSG_MMS_SMIL_HELP_PAGE_DURATION;
171 _msg_smil_cont_mgr_set_cur_slide_help_page(newSlideContent, ((attachCnt > 0) ? TRUE : FALSE));
173 /*create master slide*/
174 newSlideContent->commonData = __msg_smil_content_mgr_create_master_slide(msg_info_t);
175 if (newSlideContent->commonData == NULL) {
176 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "__msg_smil_content_mgr_create_master_slide is failed");
177 if (newSlideContent) {
178 free(newSlideContent);
179 newSlideContent = NULL;
184 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "This is not mixed message");
187 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
188 return newSlideContent;
191 static SMIL_SLIDE_INFO_S *__msg_smil_content_mgr_create_related_message(msg_struct_t msg_info_t)
193 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
194 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, msg_info_t == NULL, NULL);
195 SMIL_SLIDE_INFO_S *firstSlide = NULL; /*first slide pointer to be returned*/
196 SMIL_SLIDE_INFO_S *newSlideContent = NULL;
199 MSG_BOOL bSkipEmptyPage = FALSE;
200 msg_list_handle_t pagelist_info = NULL;
201 msg_struct_t page_info = NULL;
202 msg_list_handle_t medialist_info = NULL;
203 msg_list_handle_t attachlist_info = NULL;
205 //Get page info and count
206 msg_get_list_handle(msg_info_t, MSG_MMS_PAGE_LIST_HND, (void **)&pagelist_info);
207 pageCnt = msg_list_length(pagelist_info);
209 //Get attach info and count
210 msg_get_list_handle(msg_info_t, MSG_MMS_ATTACH_LIST_HND, (void **)&attachlist_info);
211 attachCnt = msg_list_length(attachlist_info);
214 SMIL_SLIDE_INFO_S *prev = NULL;
218 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "msgData->pageCnt = %d", pageCnt);
220 while (pageIndex < pageCnt) {
221 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "pgCount = %d", pageIndex);
223 page_info = _msg_smil_cont_mgr_get_nth_page_struct_handle(pagelist_info, pageIndex);
224 medialist_info = _msg_smil_cont_mgr_get_page_media_list_handle(page_info);
225 mediaCnt = msg_list_length(medialist_info);
226 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "mediaCnt = %d", mediaCnt);
228 /* For empty page, if there's only 1 page and help page is exist, then skip composing 1st empty page. */
229 if (pageCnt == 1 && pageIndex == 0 && mediaCnt == 0 && attachCnt > 0) {
230 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "There's 1 empty page, but attachment is exist, skip composing empty 1 page!");
231 bSkipEmptyPage = TRUE;
235 newSlideContent = (SMIL_SLIDE_INFO_S *)calloc(1, sizeof(SMIL_SLIDE_INFO_S));
236 if (newSlideContent == NULL) {
237 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
238 if (firstSlide == NULL) {
241 goto FREE_SLIDE_LIST;
244 /*init silde info data*/
245 newSlideContent->pageIdx = pageIndex;
246 newSlideContent->slideStatus = PLAYER_STATUS_NONE;
247 newSlideContent->nextSlide = NULL;
248 newSlideContent->prevSlide = NULL;
250 /*set master(commonData) slide*/
251 if (pageIndex == 0) {
252 /*set smilContent of content mgr as first slide pointer */
253 firstSlide = newSlideContent;
255 newSlideContent->commonData = __msg_smil_content_mgr_create_master_slide(msg_info_t);
256 if (newSlideContent->commonData == NULL) {
257 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "__msg_smil_content_mgr_create_master_slide is failed");
258 goto FREE_SLIDE_LIST;
261 /* Keeping one copy of commonData and makig all pointers to point to that copy */
262 newSlideContent->commonData = firstSlide->commonData;
266 newSlideContent->pageInfo = (SMIL_PAGE_INFO_S *)calloc(1, sizeof(SMIL_PAGE_INFO_S));
267 if (newSlideContent->pageInfo == NULL) {
268 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
269 goto FREE_SLIDE_LIST;
273 newSlideContent->pageInfo->mediaCnt = mediaCnt;
274 newSlideContent->pageInfo->isTexttop = FALSE;
275 newSlideContent->pageInfo->hasText = FALSE;
276 newSlideContent->pageInfo->hasImage = FALSE;
277 newSlideContent->pageInfo->hasVideo = FALSE;
278 newSlideContent->pageInfo->hasAudio = FALSE;
280 msg_get_int_value(page_info, MSG_MMS_PAGE_PAGE_DURATION_INT, &(newSlideContent->pageInfo->pageDuration));
283 while (index < mediaCnt) {
284 msg_struct_t media_info = _msg_smil_cont_mgr_get_page_nth_media_struct_handle(medialist_info, index);
286 _msg_smil_cont_mgr_get_media_int_value(media_info, MSG_MMS_MEDIA_TYPE_INT, &mediaType);
288 if (mediaType == MMS_SMIL_MEDIA_TEXT) {
289 newSlideContent->pageInfo->hasText = TRUE;
292 } else if (mediaType == MMS_SMIL_MEDIA_AUDIO) {
293 newSlideContent->pageInfo->hasAudio = TRUE;
296 } else if (mediaType == MMS_SMIL_MEDIA_VIDEO || mediaType == MMS_SMIL_MEDIA_IMG_OR_VIDEO) {
297 newSlideContent->pageInfo->hasVideo = TRUE;
300 } else if (mediaType == MMS_SMIL_MEDIA_IMG || mediaType == MMS_SMIL_MEDIA_ANIMATE) {
301 newSlideContent->pageInfo->hasImage = TRUE;
310 if (newSlideContent->pageInfo->hasText &&
311 (newSlideContent->pageInfo->hasVideo || newSlideContent->pageInfo->hasImage)) {
316 char szID_0[MAX_SMIL_REGION_ID] = {0,};
317 char szID_1[MAX_SMIL_REGION_ID] = {0,};
319 msg_list_handle_t region_list = NULL;
320 msg_get_list_handle(msg_info_t, MSG_MMS_REGION_LIST_HND, (void **)®ion_list);
323 msg_struct_t region_info_0 = (msg_struct_t)msg_list_nth_data(region_list, 0);
324 msg_get_str_value(region_info_0, MSG_MMS_REGION_ID_STR, szID_0, sizeof(szID_0));
325 msg_get_int_value(region_info_0, MSG_MMS_REGION_LENGTH_TOP_INT, &nTop_0);
326 msg_get_int_value(region_info_0, MSG_MMS_REGION_LENGTH_HEIGHT_INT, &nHeight_0);
329 msg_struct_t region_info_1 = (msg_struct_t)msg_list_nth_data(region_list, 1);
330 msg_get_str_value(region_info_1, MSG_MMS_REGION_ID_STR, szID_1, sizeof(szID_1));
331 msg_get_int_value(region_info_1, MSG_MMS_REGION_LENGTH_TOP_INT, &nTop_1);
332 msg_get_int_value(region_info_1, MSG_MMS_REGION_LENGTH_HEIGHT_INT, &nHeight_1);
335 * if (text's top == 0 & image's top != 0)
337 * else if (text's top < image's top)
339 * else if (text's top == 0 & image's top == 0) {
340 * if (text' height < image's height )
345 /*find and set image, text region*/
346 if (!strcasecmp(szID_0, "Image")) { /*Image top region_info_0 is IMAGE REGION*/
347 if (nTop_1 == 0 && nTop_0 != 0) {
348 newSlideContent->pageInfo->isTexttop = TRUE;
349 } else if (nTop_1 < nTop_0) {
350 newSlideContent->pageInfo->isTexttop = TRUE;
351 } else if (nTop_1 == 0 && nTop_0 == 0) {
352 if (nHeight_1 < nHeight_0) {
353 newSlideContent->pageInfo->isTexttop = TRUE;
357 } else if (!strcasecmp(szID_1, "Image")) { /* region_info_1 is IMAGE_REGION */
358 if (nTop_0 == 0 && nTop_1 != 0) {
359 newSlideContent->pageInfo->isTexttop = TRUE;
360 } else if (nTop_0 < nTop_1) {
361 newSlideContent->pageInfo->isTexttop = TRUE;
362 } else if (nTop_0 == 0 && nTop_1 == 0) {
363 if (nHeight_0 < nHeight_1) {
364 newSlideContent->pageInfo->isTexttop = TRUE;
370 /*set prev, next slide pointer*/
371 newSlideContent->prevSlide = prev;
373 prev->nextSlide = newSlideContent;
376 prev = newSlideContent;
380 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "This is not related message");
384 SMIL_SLIDE_INFO_S *lastSlide = NULL; /*last slide pointer to ref for help page */
385 newSlideContent = (SMIL_SLIDE_INFO_S *)calloc(1, sizeof(SMIL_SLIDE_INFO_S));
386 if (newSlideContent == NULL) {
387 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
391 newSlideContent->pageIdx = (bSkipEmptyPage) ? pageCnt-1 : pageCnt; //set last page
392 newSlideContent->slideStatus = PLAYER_STATUS_NONE;
393 newSlideContent->nextSlide = NULL;
396 newSlideContent->commonData = firstSlide->commonData;
398 newSlideContent->commonData = __msg_smil_content_mgr_create_master_slide(msg_info_t);
401 newSlideContent->pageInfo = (SMIL_PAGE_INFO_S *)calloc(1, sizeof(SMIL_PAGE_INFO_S));
402 if (newSlideContent->pageInfo == NULL) {
403 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "calloc is failed");
404 if (firstSlide == NULL) {
407 goto FREE_SLIDE_LIST;
411 newSlideContent->pageInfo->mediaCnt = 0;
412 newSlideContent->pageInfo->isTexttop = FALSE;
413 newSlideContent->pageInfo->hasText = FALSE;
414 newSlideContent->pageInfo->hasImage = FALSE;
415 newSlideContent->pageInfo->hasVideo = FALSE;
416 newSlideContent->pageInfo->hasAudio = FALSE;
417 newSlideContent->pageInfo->pageDuration = MSG_MMS_SMIL_HELP_PAGE_DURATION;
418 _msg_smil_cont_mgr_set_cur_slide_help_page(newSlideContent, TRUE);
420 /* set no media contents */
423 lastSlide = firstSlide; //set first slide for searching last slide
425 for (; lastSlide->nextSlide != NULL ;)
426 lastSlide = lastSlide->nextSlide;
428 newSlideContent->prevSlide = lastSlide;
429 lastSlide->nextSlide = newSlideContent;
431 firstSlide->commonData->pageCnt += 1;
433 newSlideContent->prevSlide = NULL;
434 newSlideContent->nextSlide = NULL;
436 firstSlide = newSlideContent;
441 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
445 /*free current slide data*/
446 if (newSlideContent) {
447 if (newSlideContent->pageInfo) {
448 free(newSlideContent->pageInfo);
449 newSlideContent->pageInfo = NULL;
451 free(newSlideContent);
452 newSlideContent = NULL;
455 __msg_smil_content_mgr_free_slide_list(firstSlide);
462 /*********************************************************************************************
463 *This method allocates memory and does a deep copy of the message details received from the FW.
464 *********************************************************************************************/
465 static MSG_SMIL_ERROR_E __msg_smil_content_mgr_create_page_content(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle, msg_struct_t msg_info_t)
467 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
468 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, MSG_ERR_SMIL_INVALID_PARAMETER);
469 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, msg_info_t == NULL, MSG_ERR_SMIL_INVALID_PARAMETER);
471 MSG_BOOL isMixedMsg = FALSE;
473 msg_list_handle_t pagelist_info = NULL;
474 msg_get_list_handle(msg_info_t, MSG_MMS_PAGE_LIST_HND, (void **)&pagelist_info);
475 pageCnt = msg_list_length(pagelist_info);
477 isMixedMsg = (pageCnt == 0) ? TRUE : FALSE;
479 if (isMixedMsg) { /*multipart mixed mms*/
480 smilContMgrHndle->smilContent = __msg_smil_content_mgr_create_mixed_message(msg_info_t);
481 if (smilContMgrHndle->smilContent == NULL) {
482 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "__msg_smil_content_mgr_create_mixed_message is failed");
483 return MSG_ERR_SMIL_INVALID_STORAGE;
485 } else { /*multipart related mms*/
486 smilContMgrHndle->smilContent = __msg_smil_content_mgr_create_related_message(msg_info_t);
487 if (smilContMgrHndle->smilContent == NULL) {
488 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "__msg_smil_content_mgr_create_mixed_message is failed");
489 return MSG_ERR_SMIL_INVALID_STORAGE;
492 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
494 return MSG_SMIL_SUCCESS;
499 static void __msg_smil_content_mgr_free_slide_list(SMIL_SLIDE_INFO_S *deleteSlide)
501 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
502 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, deleteSlide == NULL);
504 if (deleteSlide->nextSlide == NULL) { /*Single Slide message*/
505 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Freeing smilContent if MMS has one page");
507 if (deleteSlide->commonData != NULL) {
508 free(deleteSlide->commonData);
509 deleteSlide->commonData = NULL;
512 if (deleteSlide->pageInfo != NULL) {
513 free(deleteSlide->pageInfo);
514 deleteSlide->pageInfo = NULL;
519 } else { /*Multiple Slides message*/
520 SMIL_SLIDE_INFO_S *nextSlide = NULL;
521 while (deleteSlide->nextSlide != NULL) {
522 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Freeing smilContent: page = %d ", deleteSlide->pageIdx);
523 nextSlide = deleteSlide->nextSlide;
525 if (deleteSlide->pageIdx == 0) {
526 if (deleteSlide->commonData != NULL) {
527 free(deleteSlide->commonData);
528 deleteSlide->commonData = NULL;
534 deleteSlide = nextSlide;
537 /*free the last slide data*/
538 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Freeing smilContent last page");
540 if (deleteSlide->pageInfo != NULL) {
541 free(deleteSlide->pageInfo);
542 deleteSlide->pageInfo = NULL;
548 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
552 void _msg_smil_destroy_content_mgr(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle)
554 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
555 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL);
556 SMIL_SLIDE_INFO_S *deleteSlide = smilContMgrHndle->smilContent;
558 __msg_smil_content_mgr_free_slide_list(deleteSlide);
559 smilContMgrHndle->smilContent = NULL;
561 free(smilContMgrHndle);
563 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
567 static MSG_BOOL __msg_smil_cont_mgr_is_valid_slide(SMIL_MASTER_SLIDE_INFO_S *commonData, int curSlideIdx)
569 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, commonData == NULL, FALSE);
571 if (commonData->pageCnt > 0) { /*Multipart Related message*/
572 if (curSlideIdx > (commonData->pageCnt - 1) || curSlideIdx < 0)
574 } else if (commonData->pageCnt == 0) { /*Multipart Mixed message*/
575 if (curSlideIdx > (commonData->pageCnt) || curSlideIdx < 0)
585 MSG_BOOL _msg_smil_cont_mgr_set_status(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle, int slideIdx, SMIL_PLAYER_STATUS_E event)
587 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
588 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, FALSE);
589 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent == NULL, FALSE);
590 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent->commonData == NULL, FALSE);
591 SMIL_SLIDE_INFO_S *findSlide = smilContMgrHndle->smilContent;
594 if (__msg_smil_cont_mgr_is_valid_slide(findSlide->commonData, slideIdx) == FALSE) {
595 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Slide index is invalid");
599 while (count < slideIdx) {
600 findSlide = findSlide->nextSlide;
603 findSlide->slideStatus = event;
605 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Slide number = %d", findSlide->pageIdx);
606 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Slide Status = %d", findSlide->slideStatus);
611 SMIL_PLAYER_STATUS_E _msg_smil_cont_mgr_get_status(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle, int slideIdx)
613 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
614 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, PLAYER_STATUS_INVALID);
615 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent == NULL, PLAYER_STATUS_INVALID);
616 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent->commonData == NULL, PLAYER_STATUS_INVALID);
617 SMIL_SLIDE_INFO_S *findSlide = smilContMgrHndle->smilContent;
620 if (__msg_smil_cont_mgr_is_valid_slide(findSlide->commonData, slideIdx) == FALSE) {
621 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Slide index is invalid");
622 return PLAYER_STATUS_INVALID;
625 while (count < slideIdx) {
626 findSlide = findSlide->nextSlide;
630 return findSlide->slideStatus;
635 SMIL_PLAYER_STATUS_E _msg_smil_cont_mgr_get_cur_slide_status(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle)
637 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
638 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, PLAYER_STATUS_INVALID);
639 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent == NULL, PLAYER_STATUS_INVALID);
640 SMIL_SLIDE_INFO_S *findSlide = smilContMgrHndle->smilContent;
643 while (count < smilContMgrHndle->curSlideIdx) {
644 findSlide = findSlide->nextSlide;
647 if (findSlide == NULL) {
648 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "smilContMgrHndle->smilContent is NULL");
649 return PLAYER_STATUS_INVALID;
653 return (findSlide->slideStatus);
657 int _msg_smil_cont_mgr_get_cur_slide_idx(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle)
659 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
660 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, MSG_MMS_SLIDE_INVALID);
662 return smilContMgrHndle->curSlideIdx;
666 MSG_BOOL _msg_smil_cont_mgr_set_cur_slide_idx(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle, int slideIdx)
668 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
669 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, FALSE);
670 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent == NULL, FALSE);
671 SMIL_SLIDE_INFO_S *firstSlide = smilContMgrHndle->smilContent;
673 if (firstSlide->commonData) {
674 if (__msg_smil_cont_mgr_is_valid_slide(firstSlide->commonData, slideIdx) == FALSE) {
675 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Slide index is invalid");
679 smilContMgrHndle->curSlideIdx = slideIdx;
681 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Slide index is invalid");
685 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
690 int _msg_smil_cont_mgr_get_total_slide_count(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle)
692 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
693 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, MSG_MMS_SLIDE_INVALID);
694 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent == NULL, MSG_MMS_SLIDE_INVALID);
695 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent->commonData == NULL, MSG_MMS_SLIDE_INVALID);
697 return smilContMgrHndle->smilContent->commonData->pageCnt;
701 SMIL_SLIDE_INFO_S *_msg_smil_cont_mgr_get_cur_slide(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle)
703 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
704 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, NULL);
705 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent == NULL, NULL);
706 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent->commonData == NULL, NULL);
707 SMIL_SLIDE_INFO_S *findSlide = smilContMgrHndle->smilContent;
708 int pageCnt = findSlide->commonData->pageCnt;
711 while (count < pageCnt) {
712 if (count == smilContMgrHndle->curSlideIdx) {
715 findSlide = findSlide->nextSlide;
719 //Adjust Mixed type msg, first slide should be set as cur slide
721 msg_list_handle_t page_list_t = _msg_smil_cont_mgr_get_page_list_handle(smilContMgrHndle);
726 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
732 SMIL_SLIDE_INFO_S *_msg_smil_cont_mgr_get_slide(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle, int slideIdx)
734 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
735 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, NULL);
736 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent == NULL, NULL);
737 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "slide Index = %d", slideIdx);
738 SMIL_SLIDE_INFO_S *findSlide = smilContMgrHndle->smilContent;
740 if (findSlide->commonData) {
741 if (__msg_smil_cont_mgr_is_valid_slide(findSlide->commonData, slideIdx) == FALSE) {
742 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Slide index is invalid");
746 while (findSlide->pageIdx < slideIdx) {
747 findSlide = findSlide->nextSlide;
748 if (findSlide == NULL)
753 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
757 void _msg_smil_cont_mgr_set_cur_slide_help_page(SMIL_SLIDE_INFO_S *singleSlideInfo, MSG_BOOL bSet)
759 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
760 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, singleSlideInfo == NULL);
761 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, singleSlideInfo->pageInfo == NULL);
763 singleSlideInfo->pageInfo->isHelpPage = bSet;
766 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Current page set as help page!");
768 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Current page set as normal page!");
771 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
774 MSG_BOOL _msg_smil_cont_mgr_is_cur_slide_help_page(SMIL_SLIDE_INFO_S *singleSlideInfo)
776 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
777 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, singleSlideInfo == NULL, FALSE);
778 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, singleSlideInfo->pageInfo == NULL, FALSE);
780 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "The result of checking help page = %d", singleSlideInfo->pageInfo->isHelpPage);
782 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
783 return singleSlideInfo->pageInfo->isHelpPage;
786 MSG_BOOL _msg_smil_cont_mgr_delete_help_page(msg_struct_t msg_info_t, SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle)
788 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
789 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, msg_info_t == NULL, FALSE);
790 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, FALSE);
791 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent == NULL, FALSE);
793 MSG_BOOL isMixedMsg = FALSE;
794 msg_list_handle_t pagelist_info = NULL;
795 msg_struct_t page_info = NULL;
796 msg_list_handle_t medialist_info = NULL;
797 msg_list_handle_t attachlist_info = NULL;
802 SMIL_SLIDE_INFO_S *curSlide = smilContMgrHndle->smilContent;
804 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, curSlide == NULL, FALSE);
805 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, curSlide->commonData == NULL, FALSE);
806 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, curSlide->pageInfo == NULL, FALSE);
808 /* get page list info */
809 msg_get_list_handle(msg_info_t, MSG_MMS_PAGE_LIST_HND, (void **)&pagelist_info);
810 pageCnt = msg_list_length(pagelist_info);
812 isMixedMsg = (pageCnt == 0) ? TRUE : FALSE;
815 /* change current slide page tag */
816 _msg_smil_cont_mgr_set_cur_slide_help_page(curSlide, FALSE);
818 /*set prev, next slide pointer*/
819 curSlide->prevSlide = NULL;
820 curSlide->nextSlide = NULL;
821 } else { // related msg
823 msg_get_list_handle(msg_info_t, MSG_MMS_ATTACH_LIST_HND, (void **)&attachlist_info);
824 attachCnt = msg_list_length(attachlist_info);
826 //Check 1st page media info, media count
827 page_info = _msg_smil_cont_mgr_get_nth_page_struct_handle(pagelist_info, 0);
828 medialist_info = _msg_smil_cont_mgr_get_page_media_list_handle(page_info);
829 mediaCnt = msg_list_length(medialist_info);
832 if (pageCnt == 1 && mediaCnt == 0) { // condition for skip and show Help page direct
833 /* change current slide page tag */
834 _msg_smil_cont_mgr_set_cur_slide_help_page(curSlide, FALSE);
836 /*set prev, next slide pointer*/
837 curSlide->prevSlide = NULL;
838 curSlide->nextSlide = NULL;
840 SMIL_SLIDE_INFO_S *firstSlide = NULL; /*first slide */
841 SMIL_SLIDE_INFO_S *lastSlide = NULL; /*last slide pointer to ref for help page */
842 SMIL_SLIDE_INFO_S *lastaheadSlide = NULL; /*last ahead slide pointer */
844 firstSlide = _msg_smil_cont_mgr_get_slide(smilContMgrHndle, 0);
845 if (firstSlide == NULL) {
846 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "failed in getting firstSlide");
849 lastSlide = firstSlide; //copy pointer to last slide
851 for(; lastSlide->nextSlide; )
852 lastSlide = lastSlide->nextSlide;
854 lastaheadSlide = lastSlide->prevSlide;
856 firstSlide->commonData->pageCnt -= 1;
857 lastaheadSlide->nextSlide = NULL;
859 if (lastSlide->pageInfo) {
860 free(lastSlide->pageInfo);
861 lastSlide->pageInfo = NULL;
870 MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
875 * functions for page/media struct handle with FW managed api
877 msg_list_handle_t _msg_smil_cont_mgr_get_page_list_handle(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle)
879 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
880 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, NULL);
881 msg_struct_t msg_info_t = _msg_smil_cont_mgr_get_mms_body_struct_handle(smilContMgrHndle);
882 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, msg_info_t == NULL, NULL);
886 /*Get struct handle of current page */
887 msg_list_handle_t pagelist_info = NULL;
888 msg_get_list_handle(msg_info_t, MSG_MMS_PAGE_LIST_HND, (void **)&pagelist_info);
890 pageCnt = msg_list_length(pagelist_info);
892 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, pageCnt == 0, NULL);
894 return pagelist_info;
897 msg_struct_t _msg_smil_cont_mgr_get_nth_page_struct_handle(msg_list_handle_t pagelist_info_t, int pageIdx)
899 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
900 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, pagelist_info_t == NULL, NULL);
902 int pageCnt = msg_list_length(pagelist_info_t);
903 MSG_UI_RETVM_IF(MSG_UI_LEVEL_ERR, pageCnt == 0, NULL, "page length is 0, no page is exist");
906 msg_struct_t page_info = NULL;
907 page_info = (msg_struct_t)msg_list_nth_data(pagelist_info_t, pageIdx);
912 int _msg_smil_cont_mgr_get_page_time_value(msg_struct_t pageInfo_t, int field)
914 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
915 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, pageInfo_t == NULL, MSG_MMS_SLIDE_INVALID);
919 if (field == MSG_MMS_PAGE_PAGE_DURATION_INT) {
920 msg_get_int_value(pageInfo_t, MSG_MMS_PAGE_PAGE_DURATION_INT, &time);
921 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "page duration time = %d", time);
922 } else if (field == MSG_MMS_PAGE_BEGIN_TIME_INT) {
923 msg_get_int_value(pageInfo_t, MSG_MMS_PAGE_BEGIN_TIME_INT, &time);
924 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "page begin time = %d", time);
925 } else if (field == MSG_MMS_PAGE_END_TIME_INT) {
926 msg_get_int_value(pageInfo_t, MSG_MMS_PAGE_END_TIME_INT, &time);
927 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "page end time = %d", time);
928 } else if (field == MSG_MMS_PAGE_MIN_INT) {
929 msg_get_int_value(pageInfo_t, MSG_MMS_PAGE_MIN_INT, &time);
930 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "page min time = %d", time);
931 } else if (field == MSG_MMS_PAGE_MAX_INT) {
932 msg_get_int_value(pageInfo_t, MSG_MMS_PAGE_MAX_INT, &time);
933 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "page max time = %d", time);
934 } else if (field == MSG_MMS_PAGE_REPEAT_INT) {
935 msg_get_int_value(pageInfo_t, MSG_MMS_PAGE_REPEAT_INT, &time);
936 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "page repeat time = %d", time);
942 msg_list_handle_t _msg_smil_cont_mgr_get_page_media_list_handle(msg_struct_t pageInfo_t)
944 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
945 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, pageInfo_t == NULL, NULL);
948 /*Get media list handler */
949 msg_list_handle_t medialist_info = NULL;
950 msg_get_list_handle(pageInfo_t, MSG_MMS_PAGE_MEDIA_LIST_HND, (void **)&medialist_info);
951 mediaCnt = msg_list_length(medialist_info);
954 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "media count is 0, no medias in page");
958 return medialist_info;
961 msg_struct_t _msg_smil_cont_mgr_get_page_nth_media_struct_handle(msg_list_handle_t medialist_info_t, int mediaIdx)
963 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
964 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, medialist_info_t == NULL, NULL);
966 int mediaCnt = msg_list_length(medialist_info_t);
967 MSG_UI_RETVM_IF(MSG_UI_LEVEL_ERR, mediaCnt == 0, NULL, "media count is 0, no medias in page");
970 msg_struct_t media_info = NULL;
971 media_info = (msg_struct_t)msg_list_nth_data(medialist_info_t, mediaIdx);
976 void _msg_smil_cont_mgr_get_media_str_value(msg_struct_t media_info_t, int strfield, char *rtnStr)
978 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
979 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, media_info_t == NULL);
981 if (strfield == MSG_MMS_MEDIA_TYPE_INT ||
982 strfield == MSG_MMS_MEDIA_DRM_TYPE_INT ||
983 strfield == MSG_MMS_MEDIA_SMIL_TEXT_HND ||
984 strfield == MSG_MMS_MEDIA_SMIL_AVI_HND ) {
985 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "field value(%d) is not STRING type", strfield);
989 char strbuf[2048] = {0,};
991 if (strfield == MSG_MMS_MEDIA_SRC_STR)
992 msg_get_str_value(media_info_t, MSG_MMS_MEDIA_SRC_STR, strbuf, sizeof(strbuf));
993 else if (strfield == MSG_MMS_MEDIA_FILENAME_STR)
994 msg_get_str_value(media_info_t, MSG_MMS_MEDIA_FILENAME_STR, strbuf, sizeof(strbuf));
995 else if (strfield == MSG_MMS_MEDIA_FILEPATH_STR)
996 msg_get_str_value(media_info_t, MSG_MMS_MEDIA_FILEPATH_STR, strbuf, sizeof(strbuf));
997 else if (strfield == MSG_MMS_MEDIA_CONTENT_ID_STR)
998 msg_get_str_value(media_info_t, MSG_MMS_MEDIA_CONTENT_ID_STR, strbuf, sizeof(strbuf));
999 else if (strfield == MSG_MMS_MEDIA_REGION_ID_STR)
1000 msg_get_str_value(media_info_t, MSG_MMS_MEDIA_REGION_ID_STR, strbuf, sizeof(strbuf));
1001 else if (strfield == MSG_MMS_MEDIA_ALTERNATIVE_STR)
1002 msg_get_str_value(media_info_t, MSG_MMS_MEDIA_ALTERNATIVE_STR, strbuf, sizeof(strbuf));
1003 else if (strfield == MSG_MMS_MEDIA_DRM_FULLPATH_STR)
1004 msg_get_str_value(media_info_t, MSG_MMS_MEDIA_DRM_FULLPATH_STR, strbuf, sizeof(strbuf));
1006 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "STRING field value(%d) is %s", strfield, strbuf);
1007 strncpy(rtnStr, strbuf, strlen(strbuf));
1010 void _msg_smil_cont_mgr_get_media_int_value(msg_struct_t media_info_t, int intfield, int* rtnVal)
1012 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1013 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, media_info_t == NULL);
1015 if (intfield != MSG_MMS_MEDIA_TYPE_INT && intfield != MSG_MMS_MEDIA_DRM_TYPE_INT) {
1016 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "field value(%d) is not INT type", intfield);
1020 if (intfield == MSG_MMS_MEDIA_TYPE_INT)
1021 msg_get_int_value(media_info_t, MSG_MMS_MEDIA_TYPE_INT, rtnVal);
1022 else if (intfield == MSG_MMS_MEDIA_DRM_TYPE_INT)
1023 msg_get_int_value(media_info_t, MSG_MMS_MEDIA_DRM_TYPE_INT, rtnVal);
1025 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "field value(%d) is %d", intfield, *rtnVal);
1028 msg_struct_t _msg_smil_cont_mgr_get_mms_body_struct_handle(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle)
1030 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1031 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, NULL);
1032 return smilContMgrHndle->msg_info_t;
1035 MSG_BOOL _msg_smil_cont_mgr_get_slide_time(SMIL_CONTENT_MGR_HANDLE_S *smilContMgrHndle, int slideIdx, MSG_BOOL bExcludeHp, double *time)
1037 MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
1038 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle == NULL, FALSE);
1039 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, smilContMgrHndle->smilContent == NULL, FALSE);
1041 SMIL_SLIDE_INFO_S *curSlide = _msg_smil_cont_mgr_get_slide(smilContMgrHndle, 0);
1042 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, curSlide == NULL, FALSE);
1043 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, curSlide->commonData == NULL, FALSE);
1044 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, curSlide->pageInfo == NULL, FALSE);
1046 MSG_BOOL is_mixed_msg = FALSE;
1047 double total_time = 0;
1048 char szFilePath[MSG_FILEPATH_LEN_MAX] = {0,};
1049 msg_list_handle_t page_list_info = NULL;
1050 msg_struct_t page_info = NULL;
1052 is_mixed_msg = (curSlide->commonData->pageCnt == 0) ? TRUE : FALSE;
1054 //check validity input page index
1055 if ((curSlide =_msg_smil_cont_mgr_get_slide(smilContMgrHndle, slideIdx)) == NULL) {
1056 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Current msg is Multipart related msg, but there's no page with given index (%d)!", slideIdx);
1061 if (slideIdx != 0) {
1062 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "Mixed msg cannot have 1 more page!");
1065 total_time = (double)MSG_MMS_SMIL_HELP_PAGE_DURATION;
1067 while (slideIdx < curSlide->commonData->pageCnt) {
1068 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "slideIdx = %d", slideIdx);
1069 double pagetime = 0.0;
1072 double maximum_time = 0.0;
1074 curSlide =_msg_smil_cont_mgr_get_slide(smilContMgrHndle, slideIdx);
1076 if (curSlide == NULL || curSlide->pageInfo == NULL) {
1077 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "curSlide is NULL or pageInfo in curSlide is NULL!");
1081 if (bExcludeHp && curSlide->pageInfo->isHelpPage) {
1082 if (slideIdx == 0 && curSlide->commonData->pageCnt == 1) {
1083 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "Total page count = 1, And if there's only 1 help page, set default time for duration.");
1084 total_time = (double)MSG_MMS_SMIL_HELP_PAGE_DURATION;
1087 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "current page(%d) is Help page and bExcludeHp flag is %d, skip calculating this page", curSlide->pageIdx, bExcludeHp);
1092 //set pagetime as duration time
1093 pagetime = (double)(curSlide->pageInfo->pageDuration);
1095 // get media time value for pagetime is not valid
1098 page_list_info = _msg_smil_cont_mgr_get_page_list_handle(smilContMgrHndle);
1100 page_info = _msg_smil_cont_mgr_get_nth_page_struct_handle(page_list_info, curSlide->pageIdx);
1102 if (page_info && curSlide->pageInfo->mediaCnt > 0) {
1105 msg_list_handle_t media_list_info = _msg_smil_cont_mgr_get_page_media_list_handle(page_info);
1106 mediaCnt = msg_list_length(media_list_info);
1108 while (index < mediaCnt) {
1110 msg_struct_t media_info = _msg_smil_cont_mgr_get_page_nth_media_struct_handle(media_list_info, index);
1112 if (media_info == NULL) {
1113 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "media_info is Null");
1117 bzero(szFilePath, sizeof(szFilePath));
1118 _msg_smil_cont_mgr_get_media_str_value(media_info, MSG_MMS_MEDIA_FILEPATH_STR, szFilePath);
1119 _msg_smil_cont_mgr_get_media_int_value(media_info, MSG_MMS_MEDIA_TYPE_INT, &mediaType);
1121 if (mediaType == MMS_SMIL_MEDIA_VIDEO ||
1122 mediaType == MMS_SMIL_MEDIA_AUDIO ||
1123 mediaType == MMS_SMIL_MEDIA_IMG_OR_VIDEO) {
1124 bool is_drm = FALSE;
1125 bool is_available_play = FALSE;
1127 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "mediaType = %d", mediaType);
1130 drm_bool_type_e is_drm_file = DRM_UNKNOWN;
1131 int ret = DRM_RETURN_SUCCESS;
1133 ret = drm_is_drm_file(szFilePath, &is_drm_file);
1134 is_drm = (ret == DRM_RETURN_SUCCESS && is_drm_file == DRM_TRUE) ? TRUE : FALSE;
1136 int ret = DRM_RETURN_SUCCESS;
1137 drm_license_status_e license_status = DRM_LICENSE_STATUS_UNDEFINED;
1138 ret = drm_get_license_status(szFilePath, DRM_PERMISSION_TYPE_PLAY, &license_status);
1139 if (ret != DRM_RETURN_SUCCESS) {
1140 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "drm_get_license_status is failed ret = %d", ret);
1141 is_available_play = FALSE;
1144 if (license_status != DRM_LICENSE_STATUS_VALID) {
1145 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "license_status = %d", license_status);
1146 is_available_play = FALSE;
1148 is_available_play = TRUE;
1151 is_available_play = TRUE;
1154 if (is_available_play) {
1156 metadata_extractor_h handle = NULL;
1157 ret = metadata_extractor_create(&handle);
1159 if (ret == METADATA_EXTRACTOR_ERROR_NONE) {
1160 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "tempMedia->szFilePath is %s", szFilePath);
1161 ret = metadata_extractor_set_path(handle, szFilePath);
1162 if (ret != METADATA_EXTRACTOR_ERROR_NONE) {
1163 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "metadata_extractor_set_path is failed, %d", ret);
1164 metadata_extractor_destroy(handle);
1168 ret = metadata_extractor_get_metadata(handle, METADATA_DURATION, &value);
1170 if (ret == METADATA_EXTRACTOR_ERROR_NONE) {
1172 duration = atoi(value);
1176 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "metadata_extractor_get_metadata is failed - ret(%x)", ret);
1177 metadata_extractor_destroy(handle);
1181 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "file : %s, duration : %f", szFilePath, (double)duration);
1183 metadata_extractor_destroy(handle);
1185 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "metadata_extractor_create is failed - ret(%x)", ret);
1189 //ceiling duration time
1190 double ceilvalue = ceil((double)duration/1000)*1000;
1191 if (maximum_time <= ceilvalue)
1192 maximum_time = ceilvalue;
1199 pagetime = maximum_time;
1202 total_time += pagetime;
1210 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "total slide time is %f", *time);