42 #include "dsm_control.h" 50 #define VERSION_TOKEN "version" 51 #define SIZE_TOKEN "size" 52 #define NODES_TOKEN "nodes" 53 #define NODE_TOKEN "node" 54 #define COUNT_TOKEN "count" 56 #define MANIFEST_TIMEOUT 500 57 #define MANIFEST_TIME_STOP 600 58 #define MAX_MAN_HDR_SIZE 224 59 #define MAX_PATH_LEN 64 60 #define GROUP_DIR_LEN 8 62 #define MAX_SIZE_OF_CACHED_FILE (32 * 1024) 64 #define USE_FROM_CAROUSEL 0x80 65 #define USE_VERSION_FLAG 0x40 67 #define FG_PROFILE_ALL 0x00 68 #define FG_PROFILE_HD_GRAPHICS 0x01 69 #define FG_PROFILE_HD_VIDEO 0x02 70 #define FG_PROFILE_IC 0x03 71 #define FG_PROFILE_ICS 0x04 72 #define FG_PROFILE_ICES 0x05 73 #define FG_PROFILE_LIFECYCLE 0x06 74 #define FG_PROFILE_NATIVE_APP 0x07 75 #define FG_PROFILE_DL_FONT 0x08 76 #define FG_PROFILE_SI 0x80 77 #define FG_PROFILE_PVR 0x81 79 #define INVALID_NODE_COUNTER 1000 81 #define MAX_SPECIAL_OWNER_ID 0x0003 82 #define MAX_SPECIAL_GROUP_ID 0x0009 83 #define NAME_CHAR_OFFSET 17 113 typedef struct s_stored_group
115 struct s_stored_group *next;
116 S_CarouselInfoFileGroup crsl_usr_info;
119 U8BIT dir_name[GROUP_DIR_LEN];
132 typedef struct s_fgc_request
134 struct s_fgc_request *next;
135 F_DSM_CBLOAD cb_func;
142 typedef struct s_dsm_file_rqst
151 typedef struct s_FGManifest
156 typedef struct s_manifest_rqst
158 struct s_manifest_rqst *next;
159 H_DsmControl dsmInst;
164 S_CarouselInfoFileGroup *pFG;
169 static S_STORED_GROUP* GetStoredGroup(
U16BIT owner_id,
U16BIT group_id );
170 static S_STORED_GROUP* FindValidGroup(
E_FS_ORIGIN origin,
const char **pname,
S_CONTENT **ppCtnt );
171 static BOOLEAN HasMissingFileData( S_STORED_GROUP *pSGrp );
172 static void ManifestLoadGood(
void *userData,
S_CONTENT *pContent );
173 static void ManifestLoadFail(
void *userData );
174 static void FileLoadedGood(
void *userData,
S_CONTENT *pContent );
175 static void FileLoadedFail(
void *userData );
176 static void LoadAllFileData( S_STORED_GROUP *pSGrp,
U8BIT cachePriority );
177 static void GetAllFileData( S_STORED_GROUP *pSGrp,
U8BIT cachePriority );
178 static E_FsStatus ReadFileData( S_STORED_GROUP *pSGrp,
const char *fname,
S_CONTENT *pCtnt );
179 static BOOLEAN DeleteFileInNvm( S_STORED_GROUP *pSGrp,
const char *fname );
180 static void DeleteAllFiles( S_STORED_GROUP *pSGrp );
181 static void FileGroupFree( S_STORED_GROUP *pSGrp );
184 static void* NodesArray(
unsigned int val,
void *array,
void *gptr );
185 static void* NodeFinish(
unsigned int val,
void *array,
void *gptr );
189 static const char hex_digits_low[] =
"0123456789abcdef";
190 static S_STRING tmp_node_filename = { 0, NULL };
191 static U32BIT tmp_node_count = 0;
192 static U32BIT tmp_group_version = 0;
193 static U32BIT tmp_group_size = 0;
217 static S_STORED_GROUP *stored_group_list = NULL;
218 static S_FGC_REQUEST *fg_request_head = NULL;
219 static S_FGC_REQUEST *fg_request_tail = NULL;
220 static U32BIT fg_nvm_max_limit = 0;
221 static S_ManRequest *fg_manifest_rqst = NULL;
222 static H_Timer fgManifestTimer = NULL;
223 static H_ObjCarousel fgTimerOC = NULL;
224 static U32BIT fgRequestCount = 0;
256 TRACE(TERROR, (
"%s", filename))
262 TRACE(TERROR, (
"%s sz %d", filename, size))
273 static S_STORED_GROUP* AddCachedManifestFile(
char *filename )
275 S_STORED_GROUP *pSGrp = NULL;
281 TRACE(TERROR, (
"%s", filename))
289 TRACE(TERROR, (
"sz %d", size))
293 if (!FileRead(filename, data, size))
295 TRACE(TERROR, (
"%s", filename))
299 pSGrp =
DSMAlloc(
sizeof(S_STORED_GROUP));
302 TRACE(TERROR, (
"malloc()"))
306 memset(pSGrp, 0,
sizeof(S_STORED_GROUP));
308 pSGrp->man_file_size = size;
310 pSGrp->total_nodes = 0;
312 pU32 = (
U32BIT *)&pSGrp->crsl_usr_info;
313 fg_cache_members[0].
u.
p_uint = pU32;
314 fg_cache_members[1].
u.
p_uint = pU32 + 1;
315 fg_cache_members[2].
u.
p_str = &pSGrp->loc_str;
318 TRACE(TERROR, (
"%s", filename))
319 FileGroupFree( pSGrp );
324 assert( tmp_group_size != 0 );
325 assert( pSGrp->total_nodes != 0 );
326 assert( pSGrp->nodes != NULL );
327 TRACE(TDSMFG, (
"Success : owner 0x%x, group 0x%x, size %d",
328 pSGrp->crsl_usr_info.owner_id, pSGrp->crsl_usr_info.group_id, tmp_group_size))
329 pSGrp->group_size = tmp_group_size;
330 pSGrp->file_version = (
U16BIT)tmp_group_version;
331 memcpy( pSGrp->dir_name, filename, 4 );
332 memcpy( pSGrp->dir_name + 4, filename + 5, 4 );
333 pSGrp->origin = GetOrigin(pSGrp->loc_str,&(pSGrp->offset));
334 #ifdef INCLUDE_SA_PROFILE 336 && pSGrp->crsl_usr_info.owner_id <= MAX_SPECIAL_OWNER_ID
337 && pSGrp->crsl_usr_info.group_id <= MAX_SPECIAL_GROUP_ID )
339 pSGrp->status = FGS_ACTIVE;
343 #ifdef INCLUDE_AU_PROFILE 344 if (!(pSGrp->crsl_usr_info.use_flags & USE_FROM_CAROUSEL))
346 pSGrp->status = FGS_PENDING;
351 pSGrp->status = FGS_PASSIVE;
353 pSGrp->next = stored_group_list;
354 stored_group_list = pSGrp;
381 assert( stored_group_list == NULL );
382 fg_nvm_max_limit = nvmSize;
395 strlen(filename) == 13 &&
396 memcmp(filename + 9,
".man", 4) == 0 &&
399 TRACE(TDSMFG, (
"found: %s", filename))
401 for (n = 0; n != 4; n++)
404 if (filename[n] >=
'0' && filename[n] <=
'9')
406 owner |= filename[n] -
'0';
408 else if (filename[n] >=
'a' && filename[n] <=
'f')
410 owner |= filename[n] + 10 -
'a';
414 TRACE(TERROR, (
"invalid char 0x%x", filename[n]))
420 TRACE(TERROR, (
" n %d", n))
425 for (n = 5; n != 9; n++)
428 if (filename[n] >=
'0' && filename[n] <=
'9')
430 group |= filename[n] -
'0';
432 else if (filename[n] >=
'a' && filename[n] <=
'f')
434 group |= filename[n] + 10 -
'a';
438 TRACE(TERROR, (
"invalid char 0x%x", filename[n]))
444 TRACE(TERROR, (
"n %d", n))
449 assert( GetStoredGroup( owner, group ) == NULL );
450 (void)AddCachedManifestFile( filename );
466 S_STORED_GROUP *pSGrp;
470 while (stored_group_list != NULL)
472 pSGrp = stored_group_list;
473 stored_group_list = stored_group_list->next;
474 FileGroupFree( pSGrp );
478 static void SetFilename(
U16BIT owner_id,
U16BIT group_id,
char *fname )
480 const char *digits = hex_digits_low;
486 strcpy(fname + 9,
".man");
490 fname[n] = digits[tmp & 0xf];
500 fname[n] = digits[tmp & 0xf];
509 switch (receiver_profile)
511 case FG_PROFILE_HD_GRAPHICS:
514 case FG_PROFILE_HD_VIDEO:
523 case FG_PROFILE_ICES:
527 case FG_PROFILE_NATIVE_APP:
530 case FG_PROFILE_DL_FONT:
540 case FG_PROFILE_LIFECYCLE:
549 static S_ManRequest *FindManRequest(H_ObjCarousel hOC)
551 S_ManRequest *pManRqst = fg_manifest_rqst;
552 while ((pManRqst != NULL) && (hOC != pManRqst->hOC))
554 pManRqst = pManRqst->next;
559 static void FreeManRequest(S_ManRequest *pManRqst)
563 if (pManRqst->outstanding)
567 for (total = pManRqst->total; total--; pContent++)
574 pContent->destroy( pContent->fs_handle );
575 pContent->destroy = NULL;
576 pContent->fs_handle = NULL;
578 pManRqst->outstanding--;
579 if (!pManRqst->outstanding)
583 DSMCC_ClientUnloadFileGroups( pManRqst->dsmInst, pManRqst->hOC, pManRqst->pFG );
592 static
void DisableStoreGroupsFromCarousel( H_ObjCarousel hOC )
594 S_STORED_GROUP *pStoreGrp = stored_group_list;
595 while (pStoreGrp != NULL)
597 if (pStoreGrp->hOC == hOC)
600 || pStoreGrp->crsl_usr_info.owner_id > MAX_SPECIAL_OWNER_ID
601 || pStoreGrp->crsl_usr_info.group_id > MAX_SPECIAL_GROUP_ID )
603 pStoreGrp->status = FGS_PASSIVE;
604 pStoreGrp->hOC = NULL;
607 pStoreGrp = pStoreGrp->next;
611 static void ClearManRequest( H_ObjCarousel hOC )
613 S_ManRequest *pManRqst, **ppManRqst;
615 TRACE(TDSMFG, (
"ObjCrsl=%p", hOC))
616 pManRqst = fg_manifest_rqst;
617 ppManRqst = &fg_manifest_rqst;
618 while (pManRqst != NULL)
620 if (hOC == pManRqst->hOC)
622 *ppManRqst = pManRqst->next;
623 DisableStoreGroupsFromCarousel(hOC);
624 FreeManRequest( pManRqst );
627 ppManRqst = &(pManRqst->next);
628 pManRqst = pManRqst->next;
632 static void AddManRequest(H_ObjCarousel hOC)
634 S_ManRequest *pManRqst;
635 S_CarouselInfoFileGroup *pFG;
636 H_DsmControl dsmInst;
640 if (!DSMCC_ClientLoadFileGroups(dsmInst, hOC, &total, &pFG))
642 TRACE(TERROR, (
"DSMCC_ClientLoadFileGroups failure ObjCrsl=%p",hOC))
647 TRACE(TDSMFG, (
"ObjCrsl=%p total=%d", hOC, total ))
648 pManRqst =
DSMAlloc( sizeof(S_ManRequest) + (total * sizeof(S_FGManifest)) );
649 if (pManRqst == NULL)
651 TRACE(TERROR, (
"Memory failure"))
652 DSMCC_ClientUnloadFileGroups( dsmInst, hOC, pFG );
656 pManRqst->next = fg_manifest_rqst;
657 fg_manifest_rqst = pManRqst;
658 pManRqst->dsmInst = dsmInst;
660 pManRqst->total = total;
661 pManRqst->outstanding = 0;
662 pManRqst->cachePriority = 0;
664 memset(pManRqst+1, 0, total *
sizeof(S_FGManifest));
669 static BOOLEAN LoadManifest( H_ObjCarousel hOC, S_CarouselInfoFileGroup *pFG,
U8BIT cachePriority, S_FGManifest *pFgm )
671 S_STORED_GROUP *pSGrp;
677 location.
zptr = pFG->location;
678 location.
zlen = strlen((
char *) location.
zptr);
679 SetFilename( pFG->owner_id, pFG->group_id, filename );
686 pFG->use_flags |= USE_FROM_CAROUSEL;
688 pSGrp = GetStoredGroup( pFG->owner_id, pFG->group_id );
694 pSGrp = AddCachedManifestFile( filename );
695 TRACE(TDSMFG, (
"%s, Group was not in memory %p", filename, pSGrp))
699 TRACE(TDSMFG, (
"%s, pSGrp %p", filename, pSGrp))
700 TRACE(TDSMFG, ("cgrp_ver=%d file_ver=%d flgs=%x",pFG->group_version,pSGrp->file_version,pFG->use_flags))
703 ((pFG->use_flags & USE_VERSION_FLAG) && pFG->group_version != pSGrp->file_version))
709 pSGrp->crsl_usr_info.owner_id > MAX_SPECIAL_OWNER_ID ||
710 pSGrp->crsl_usr_info.group_id > MAX_SPECIAL_GROUP_ID)
712 TRACE(TDSMFG,(
"Stale group %x,%x",pSGrp->crsl_usr_info.owner_id,pSGrp->crsl_usr_info.group_id))
713 pSGrp->status = FGS_STALE;
718 TRACE(TDSMFG,(
"Starting update of special group %x,%x",pSGrp->crsl_usr_info.owner_id,pSGrp->crsl_usr_info.group_id))
723 pFG, ManifestLoadGood, ManifestLoadFail );
726 #ifdef INCLUDE_AU_PROFILE 727 else if (!(pSGrp->crsl_usr_info.use_flags & USE_FROM_CAROUSEL))
733 LoadAllFileData( pSGrp, cachePriority );
734 if (pSGrp->status != FGS_ERROR &&
735 HasMissingFileData( pSGrp ) ==
FALSE)
737 pSGrp->status = FGS_ACTIVE;
740 #endif //INCLUDE_AU_PROFILE 744 pSGrp->status = FGS_ACTIVE;
745 GetAllFileData( pSGrp, cachePriority );
758 static void FetchManifests( H_ObjCarousel hOC,
U8BIT cachePriority )
760 S_CarouselInfoFileGroup *pFG;
762 S_ManRequest *pManRqst;
765 if (fgTimerOC == hOC)
769 pManRqst = FindManRequest(hOC);
770 if (pManRqst != NULL)
773 if (!pManRqst->outstanding && pFG != NULL)
775 pManRqst->cachePriority = cachePriority;
776 pFgm = (S_FGManifest *)(pManRqst + 1);
777 for(total = pManRqst->total; total--; pFG++, pFgm++)
779 if (!FileGroupRequired( pFG->receiver_profile ))
781 TRACE(TDSMFG, (
"Group not required (0x%x,0x%x)", pFG->owner_id, pFG->group_id))
785 pManRqst->outstanding++;
786 if (!LoadManifest( hOC, pFG, cachePriority, pFgm ))
788 pManRqst->outstanding--;
804 S_ManRequest *pManRqst, **ppManRqst;
806 TRACE(TDSMFG, (
"ObjCrsl=%p", hOC))
807 if (fgTimerOC == hOC)
811 pManRqst = fg_manifest_rqst;
812 ppManRqst = &fg_manifest_rqst;
813 while (pManRqst != NULL)
815 if (hOC == pManRqst->hOC)
817 *ppManRqst = pManRqst->next;
818 pManRqst->hOC = NULL;
819 DisableStoreGroupsFromCarousel(hOC);
820 FreeManRequest( pManRqst );
823 ppManRqst = &(pManRqst->next);
824 pManRqst = pManRqst->next;
826 if (fgManifestTimer != NULL)
829 fgManifestTimer = NULL;
841 TRACE(TDSMFG, (
"hOC=%p",hOC))
853 H_ObjCarousel hOC = param->hCarousel;
854 TRACE(TDSMFG, (
"hOC=%p",hOC))
855 ClearManRequest(hOC);
857 FetchManifests( hOC, 0 );
867 H_ObjCarousel hOC = param->hCarousel;
868 TRACE(TDSMFG, (
"hOC=%p",hOC))
869 ClearManRequest(hOC);
871 FetchManifests( hOC, 0 );
878 static
void FreeContent(
S_CONTENT *pFgCtnt )
880 if (pFgCtnt->data != NULL)
882 assert( pFgCtnt->destroy != NULL );
883 if (pFgCtnt->destroy != NULL)
885 pFgCtnt->destroy( pFgCtnt->fs_handle );
886 pFgCtnt->destroy = NULL;
887 pFgCtnt->fs_handle = NULL;
889 pFgCtnt->data = NULL;
897 static void ReleaseContent(
S_CONTENT *pFgCtnt )
899 S_FGC_REQUEST *pRqst;
901 pRqst = fg_request_head;
902 while (pRqst != NULL)
904 if (pRqst->pFgCtnt == pFgCtnt)
911 pFgCtnt->
size > MAX_SIZE_OF_CACHED_FILE)
913 FreeContent( pFgCtnt );
923 static void RemoveClientRqst(
void *dsmFileRef )
925 S_FGC_REQUEST *p_rqst, *p_prv;
926 if (dsmFileRef != NULL)
928 TRACE(TDSMFG, (
"ref=%p", dsmFileRef))
929 if (fg_request_head != NULL)
931 if (dsmFileRef == fg_request_head)
933 fg_request_head = fg_request_head->next;
934 if (fg_request_head == NULL)
936 fg_request_tail = NULL;
938 ReleaseContent(((S_FGC_REQUEST *)dsmFileRef)->pFgCtnt );
939 TRACE(TDSMFG, (
"ref=%p", dsmFileRef))
944 p_prv = fg_request_head;
945 p_rqst = fg_request_head->next;
946 while (p_rqst != NULL)
948 if (p_rqst == dsmFileRef)
950 p_prv->next = p_rqst->next;
951 if (p_rqst->next == NULL)
953 fg_request_tail = p_prv;
955 ReleaseContent( p_rqst->pFgCtnt );
956 TRACE(TDSMFG, (
"ref=%p", dsmFileRef))
961 p_rqst = p_rqst->next;
975 static
E_FsStatus AquireFileData( S_STORED_GROUP *pSGrp, const
char *fname,
979 S_DSM_FILE_RQST *pDsmRqst;
981 assert( pCtnt->data == NULL );
982 if (pCtnt->user_data != NULL)
984 TRACE(TDSMFG, (
"another request for %s at %p", fname, pCtnt->user_data))
989 name.
zlen = strlen(fname);
991 pDsmRqst =
DSMAlloc(
sizeof(S_DSM_FILE_RQST) + name.
zlen + 10 );
992 if (pDsmRqst == NULL)
998 pDsmRqst->fname = (
char *)(pDsmRqst + 1);
999 memcpy( pDsmRqst->fname, pSGrp->dir_name, GROUP_DIR_LEN );
1000 pDsmRqst->fname[8] =
'/';
1001 strcpy( pDsmRqst->fname + 9, fname );
1002 pDsmRqst->sfg = pSGrp;
1003 pDsmRqst->pFgCtnt = pCtnt;
1005 pDsmRqst, FileLoadedGood, FileLoadedFail);
1006 if (pCtnt->user_data == NULL)
1029 S_STORED_GROUP *pSG;
1031 assert( cb_func != NULL );
1032 assert( pContent != NULL );
1033 assert( pContent->
destroy == NULL );
1035 pSG = FindValidGroup( origin, &fname, &pCtnt );
1040 TRACE(TDSMFG, (
"%s not in active file group", fname))
1044 S_FGC_REQUEST *pRqst =
DSMAlloc(
sizeof(S_FGC_REQUEST));
1047 TRACE(TERROR, (
"%s", fname))
1053 pRqst->cb_func = cb_func;
1054 pRqst->pFgCtnt = pCtnt;
1055 pRqst->pClientContent = pContent;
1057 if (fg_request_tail == NULL)
1059 fg_request_head = pRqst;
1063 fg_request_tail->next = pRqst;
1065 fg_request_tail = pRqst;
1067 switch (pSG->status)
1070 TRACE(TDSMFG, (
"FGS_PENDING %s", fname))
1071 fstat = FS_STATUS_PENDING;
1075 TRACE(TERROR, ("FGS_ERROR %s", fname))
1076 fstat = FS_STATUS_ERROR;
1080 if (cachePriority == 0)
1082 FreeContent( pCtnt );
1083 DeleteFileInNvm( pSG, fname );
1086 else if (pCtnt->
data != NULL)
1089 TRACE(TDSMFG, (
"FGS_ACTIVE getting %s from store", fname))
1094 fstat = ReadFileData( pSG, fname, pCtnt );
1104 TRACE(TDSMFG, (
"FGS_ACTIVE request %s from carousel", fname))
1105 fstat = AquireFileData( pSG, fname, pCtnt, cachePriority );
1109 fstat = FS_STATUS_ERROR;
1110 TRACE(TERROR, ("state unknown %d (fname=%s)", pSG->status, fname))
1113 if (fstat == FS_STATUS_ERROR)
1115 RemoveClientRqst( pRqst );
1120 pContent->
destroy = RemoveClientRqst;
1124 TRACE(TDSMFG, (
"fstat=%d", fstat))
1137 S_STORED_GROUP *pSG;
1139 pSG = FindValidGroup( origin, &fname, &pCtnt);
1144 TRACE(TDSMFG, (
"%s not in active file group", fname))
1148 TRACE(TDSMFG, (
" %s", fname))
1149 switch (pSG->status)
1158 TRACE(TERROR, (
" %s", fname))
1159 fstat = FS_STATUS_ERROR;
1176 S_STORED_GROUP *pSGrp;
1180 while (stored_group_list != NULL)
1182 pSGrp = stored_group_list;
1183 stored_group_list = stored_group_list->next;
1184 DeleteAllFiles( pSGrp );
1185 FileGroupFree( pSGrp );
1192 FetchManifests( hOC, FRP_CACHE_DEFAULT );
1205 static S_STORED_GROUP* GetStoredGroup(
U16BIT owner_id,
U16BIT group_id )
1207 S_STORED_GROUP *pStoreGrp = stored_group_list;
1208 while (pStoreGrp != NULL)
1210 if (pStoreGrp->crsl_usr_info.owner_id == owner_id &&
1211 pStoreGrp->crsl_usr_info.group_id == group_id)
1215 pStoreGrp = pStoreGrp->next;
1224 static U32BIT FileGroupTotalSize(
void )
1226 S_STORED_GROUP *pStoreGrp = stored_group_list;
1228 while (pStoreGrp != NULL)
1230 total += pStoreGrp->group_size + pStoreGrp->man_file_size;
1231 pStoreGrp = pStoreGrp->next;
1241 static void FileGroupRemove( S_STORED_GROUP *pSGrp )
1243 assert( pSGrp != NULL );
1245 if (stored_group_list)
1247 if (pSGrp == stored_group_list)
1249 stored_group_list = pSGrp->next;
1253 S_STORED_GROUP *pPrev = stored_group_list;
1254 while (pPrev->next != pSGrp && pPrev->next != NULL)
1256 pPrev = pPrev->next;
1258 if (pPrev->next == pSGrp)
1260 pPrev->next = pSGrp->next;
1271 static void FileGroupFree( S_STORED_GROUP *pSGrp )
1273 assert( pSGrp != NULL );
1275 if (pSGrp->nodes != NULL)
1277 U16BIT remaining_nodes = pSGrp->total_nodes;
1278 S_NODE *pNode = pSGrp->nodes + remaining_nodes;
1280 while (remaining_nodes > 0)
1285 if (pNode->count != 0)
1287 if (pNode->u.contents != NULL)
1296 FreeContent( pCtnt );
1306 FreeContent( &(pNode->u.content));
1308 if (pNode->nfname != NULL)
1324 static void DeleteStoredGroup(
U16BIT owner_id,
U16BIT group_id )
1326 S_STORED_GROUP *pSGrp = GetStoredGroup( owner_id, group_id );
1329 TRACE(TDSMFG, (
"Delete OLD version 0x%x", pSGrp->file_version))
1331 DeleteAllFiles( pSGrp );
1332 FileGroupRemove( pSGrp );
1333 FileGroupFree( pSGrp );
1337 static
S_CONTENT* FindMatchingNode( S_NODE *pNode,
U16BIT total, const
char *fname )
1339 U16BIT filelen, baselen, fnumber;
1340 filelen = strlen(fname);
1341 fnumber = INVALID_NODE_COUNTER;
1346 while (fname[baselen] >=
'0' && fname[baselen] <=
'9')
1348 if (baselen == filelen - 3)
1350 fnumber = ((fname[baselen] -
'0') * 100) + ((fname[baselen + 1] -
'0') * 10) + (fname[baselen + 2] -
'0');
1354 fnumber = INVALID_NODE_COUNTER;
1367 if (pNode->count == 0)
1369 if (pNode->nflen == filelen &&
1370 !memcmp(pNode->nfname, fname, filelen))
1373 return &(pNode->u.content);
1376 else if (fnumber < pNode->count && pNode->u.contents != NULL)
1378 if (pNode->nflen == baselen &&
1379 !memcmp(pNode->nfname, fname, baselen))
1382 return pNode->u.contents + fnumber;
1397 if (location.
zptr != NULL)
1399 location.
zptr += offset;
1400 location.
zlen -= offset;
1403 return pname + location.
zlen;
1416 static S_STORED_GROUP* FindValidGroup(
E_FS_ORIGIN origin,
const char** pname,
S_CONTENT** ppCtnt )
1418 S_STORED_GROUP* pSGrp;
1423 pSGrp = stored_group_list;
1424 while ( pSGrp != NULL )
1426 TRACE(TDSMFG,(
"ID (0x%x,0x%x) nodes=%d ver=%d origin=%d status=%d",
1427 pSGrp->crsl_usr_info.owner_id, pSGrp->crsl_usr_info.group_id,
1428 pSGrp->total_nodes, pSGrp->file_version, pSGrp->origin, pSGrp->status))
1429 if (pSGrp->status > FGS_LOADING &&
1430 pSGrp->nodes != NULL &&
1431 pSGrp->origin == origin)
1433 fname = MatchingLocation( origin, *pname, pSGrp->loc_str, pSGrp->offset );
1434 if ( fname != NULL )
1436 if (fname[0] ==
'/') fname++;
1437 TRACE(TDSMFG,(
"matching location: path=%s fname=%s",*pname,fname))
1438 pCtnt = FindMatchingNode( pSGrp->nodes, pSGrp->total_nodes, fname );
1439 if ( pCtnt != NULL )
1441 TRACE(TDSMFG,(
"==== Found it path %s fname %s ====",*pname,fname))
1448 pSGrp = pSGrp->next;
1458 static BOOLEAN HasMissingFileData( S_STORED_GROUP *pSGrp )
1465 assert(pSGrp->nodes != NULL);
1467 pNode = pSGrp->nodes;
1468 for (n = 0; n != pSGrp->total_nodes; n++, pNode++)
1470 if (pNode->count == 0)
1472 if (pNode->u.content.data == NULL)
1480 pCtnt = pNode->u.contents;
1481 total = pNode->count + 1;
1482 for (c = 1; c != total; c++, pCtnt++)
1484 if (pCtnt->
data == NULL)
1508 S_FGC_REQUEST *p_rqst;
1510 TRACE(TDSMFG, (
"pCtnt=%p fstat=%d", pCtnt, fstat));
1511 p_rqst = fg_request_head;
1512 while (p_rqst != NULL)
1514 if (p_rqst->pFgCtnt == pCtnt)
1517 if (p_rqst->cb_func != NULL)
1519 p_rqst->pClientContent->size = pCtnt->
size;
1520 p_rqst->pClientContent->data = pCtnt->
data;
1521 p_rqst->cb_func( fstat, p_rqst->pClientContent );
1522 p_rqst->cb_func = NULL;
1526 p_rqst = p_rqst->next;
1538 static void FulfilOutstandingFileRequests( S_STORED_GROUP *pSGrp,
E_FsStatus fstat )
1544 assert(pSGrp->nodes != NULL);
1545 assert((pSGrp->crsl_usr_info.use_flags & USE_FROM_CAROUSEL) == 0);
1546 assert(fg_request_head != NULL);
1548 pNode = pSGrp->nodes;
1549 for (n = 0; n != pSGrp->total_nodes; n++, pNode++)
1551 if (pNode->count == 0)
1553 assert( pNode->u.content.data != NULL );
1554 (void)FulfilRequest( &(pNode->u.content), fstat );
1558 pCtnt = pNode->u.contents;
1559 total = pNode->count + 1;
1560 for (c = 1; c != total; c++, pCtnt++)
1562 assert( pCtnt->
data != NULL );
1563 (void)FulfilRequest( pCtnt, fstat );
1575 static BOOLEAN FileExistsInNvm( S_STORED_GROUP *pSGrp,
char *fname )
1580 memcpy( fullname, pSGrp->dir_name, GROUP_DIR_LEN );
1582 strcpy( fullname + 9, fname );
1600 static BOOLEAN DeleteFileInNvm( S_STORED_GROUP *pSGrp,
const char *fname )
1603 memcpy( fullname, pSGrp->dir_name, GROUP_DIR_LEN );
1605 strcpy( fullname + 9, fname );
1615 static E_FsStatus ReadFileData( S_STORED_GROUP *pSGrp,
const char *fname,
S_CONTENT *pCtnt )
1622 assert( pCtnt->
data == NULL );
1624 memcpy( fullname, pSGrp->dir_name, GROUP_DIR_LEN );
1626 strcpy( fullname + 9, fname );
1630 data =
DSMAlloc((size == 0) ? 1 : size );
1633 TRACE(TERROR, (
"%s", fullname))
1634 fstat = FS_STATUS_ERROR;
1638 TRACE(TDSMFG, (
"%s in NVM is zero len", fname))
1642 pCtnt->fs_handle = data;
1646 else if (FileRead( fullname, data, size ))
1648 TRACE(TDSMFG, (
"Read %s from NVM", fname))
1651 pCtnt->destroy = DSMFree;
1652 pCtnt->fs_handle = data;
1653 fstat = FS_STATUS_OK;
1657 TRACE(TERROR, (
"%s sz %d", fullname, size))
1658 fstat = FS_STATUS_ERROR;
1664 TRACE(TDSMFG, (
"%s not in NVM", fname))
1676 static
void LoadAllFileData( S_STORED_GROUP *pSGrp,
U8BIT cachePriority )
1683 assert(pSGrp->nodes != NULL);
1685 pNode = pSGrp->nodes;
1686 for (n = 0; n != pSGrp->total_nodes; n++, pNode++)
1688 if (pNode->count == 0)
1690 if (pNode->u.content.data == NULL &&
1691 ReadFileData( pSGrp, pNode->nfname, &(pNode->u.content)) != FS_STATUS_OK)
1693 AquireFileData( pSGrp, pNode->nfname, &(pNode->u.content), cachePriority );
1698 pNumb = pNode->nfname + pNode->nflen;
1699 pCtnt = pNode->u.contents;
1700 total = pNode->count + 1;
1701 for (c = 1; c != total; c++, pCtnt++)
1703 pNumb[0] =
'0' + ((c / 100) % 10);
1704 pNumb[1] =
'0' + ((c / 10) % 10);
1705 pNumb[2] =
'0' + (c % 10);
1706 if (pCtnt->
data == NULL &&
1707 ReadFileData( pSGrp, pNode->nfname, pCtnt ) !=
FS_STATUS_OK)
1709 AquireFileData( pSGrp, pNode->nfname, pCtnt, cachePriority );
1723 static void GetAllFileData( S_STORED_GROUP *pSGrp,
U8BIT cachePriority )
1730 assert(pSGrp->nodes != NULL);
1732 pNode = pSGrp->nodes;
1733 for (n = 0; n != pSGrp->total_nodes; n++, pNode++)
1735 if (pNode->count == 0)
1737 if (pNode->u.content.data == NULL &&
1738 !FileExistsInNvm( pSGrp, pNode->nfname ))
1740 AquireFileData( pSGrp, pNode->nfname, &(pNode->u.content), cachePriority );
1745 pNumb = pNode->nfname + pNode->nflen;
1746 pCtnt = pNode->u.contents;
1747 total = pNode->count + 1;
1748 for (c = 1; c != total; c++, pCtnt++)
1750 pNumb[0] =
'0' + ((c / 100) % 10);
1751 pNumb[1] =
'0' + ((c / 10) % 10);
1752 pNumb[2] =
'0' + (c % 10);
1753 if (pCtnt->
data == NULL &&
1754 !FileExistsInNvm( pSGrp, pNode->nfname ))
1756 AquireFileData( pSGrp, pNode->nfname, pCtnt, cachePriority );
1769 static void DeleteAllFiles( S_STORED_GROUP *pSGrp )
1776 memcpy( fullname, pSGrp->dir_name, GROUP_DIR_LEN );
1779 assert(pSGrp->nodes != NULL);
1781 pNode = pSGrp->nodes;
1782 for (n = 0; n != pSGrp->total_nodes; n++, pNode++)
1784 if (pNode->count == 0)
1786 strcpy( fullname + 9, pNode->nfname );
1791 pNumb = pNode->nfname + pNode->nflen;
1792 total = pNode->count + 1;
1793 for (c = 1; c != total; c++)
1795 pNumb[0] =
'0' + ((c / 100) % 10);
1796 pNumb[1] =
'0' + ((c / 10) % 10);
1797 pNumb[2] =
'0' + (c % 10);
1798 strcpy( fullname + 9, pNode->nfname );
1804 fullname[8] = fullname[7];
1805 fullname[7] = fullname[6];
1806 fullname[6] = fullname[5];
1807 fullname[5] = fullname[4];
1817 static BOOLEAN RemoveLeastDesiredGroup(
void )
1819 S_STORED_GROUP *pSGrp;
1823 assert( stored_group_list != NULL );
1825 pSGrp = stored_group_list;
1828 #ifdef INCLUDE_SA_PROFILE 1830 || pSGrp->crsl_usr_info.owner_id > MAX_SPECIAL_OWNER_ID
1831 || pSGrp->crsl_usr_info.group_id > MAX_SPECIAL_GROUP_ID )
1834 if ( last > pSGrp->last_accessed )
1836 last = pSGrp->last_accessed;
1839 pSGrp = pSGrp->next;
1841 while (pSGrp != NULL);
1843 pSGrp = stored_group_list;
1844 while (pSGrp != NULL)
1846 if (last == pSGrp->last_accessed)
1848 DeleteAllFiles( pSGrp );
1849 FileGroupRemove( pSGrp );
1850 FileGroupFree( pSGrp );
1854 pSGrp = pSGrp->next;
1862 if (fgTimerOC == hOC)
1866 ClearManRequest(hOC);
1868 FetchManifests( hOC, 0 );
1874 static void ManifestTimeoutFunc(
BOOLEAN trig,
void *ptr,
H_Timer timer )
1876 H_ObjCarousel hOC = (H_ObjCarousel) ptr;
1880 TRACE(TERROR, (
"fgRequestCount=%d", fgRequestCount))
1882 event_msg.data_type =
DT_NONE;
1883 event_msg.data.dsmEvent.hCarousel = hOC;
1886 if (timer == fgManifestTimer)
1888 fgManifestTimer = NULL;
1892 static void SetManifestTimer(H_ObjCarousel hOC)
1894 if (fgRequestCount != MANIFEST_TIME_STOP)
1897 if (fgManifestTimer != NULL)
1900 fgManifestTimer = NULL;
1903 (void)
VT_TimerCreate( MANIFEST_TIMEOUT, ManifestTimeoutFunc, (
void *) hOC, &fgManifestTimer );
1914 static S_STORED_GROUP* ParseManifestFile(
U8BIT *data,
U32BIT size,
void *gptr, H_ObjCarousel hOC )
1916 S_CarouselInfoFileGroup *pGrp = (S_CarouselInfoFileGroup *)gptr;
1917 S_STORED_GROUP *pSGrp;
1919 pSGrp =
DSMAlloc(
sizeof(S_STORED_GROUP));
1922 TRACE(TERROR, (
"malloc()"))
1927 tmp_group_version = pGrp->group_version;
1929 memset(pSGrp, 0,
sizeof(S_STORED_GROUP));
1931 TRACE(TDSMFG, (
"owner_id 0x%x, group_id 0x%x, use_flags 0x%x, ver 0x%x", pGrp->owner_id, pGrp->group_id, pGrp->use_flags, pGrp->group_version))
1934 FileGroupFree( pSGrp );
1937 else if (tmp_group_version != pGrp->group_version)
1939 TRACE(TERROR, (
"Version mis-match file:0x%x srg:0x%x", tmp_group_version, pGrp->group_version))
1940 FileGroupFree( pSGrp );
1944 SetManifestTimer(hOC);
1951 if (tmp_group_size == 0 || pSGrp->total_nodes == 0 || pSGrp->nodes == NULL ||
1952 tmp_group_size + size + MAX_MAN_HDR_SIZE > fg_nvm_max_limit)
1954 if (tmp_group_size == 0 || pSGrp->total_nodes == 0 || pSGrp->nodes == NULL)
1956 TRACE(TDSMFG,(
"Delete empty group (%x,%x)",pGrp->owner_id,pGrp->group_id))
1960 TRACE(TERROR, (
"FG Cache overflow; required:0x%x maximum:0x%x", (tmp_group_size+size+MAX_MAN_HDR_SIZE), fg_nvm_max_limit))
1963 FileGroupFree( pSGrp );
1966 DeleteStoredGroup( pGrp->owner_id, pGrp->group_id );
1971 pSGrp->group_size = tmp_group_size;
1972 pSGrp->file_version = (
U16BIT)tmp_group_version;
1973 pSGrp->crsl_usr_info = *pGrp;
1975 pSGrp->origin = GetOrigin(pSGrp->loc_str,&(pSGrp->offset));
1976 #ifdef INCLUDE_SA_PROFILE 1978 && pGrp->owner_id <= MAX_SPECIAL_OWNER_ID
1979 && pGrp->group_id <= MAX_SPECIAL_GROUP_ID )
1981 TRACE(TDSMFG,(
"Loading new group %x,%x ver %d",pGrp->owner_id,pGrp->group_id,tmp_group_version))
1982 pSGrp->status = FGS_LOADING;
1987 TRACE(TDSMFG,(
"Delete old stale group (%x,%x) new ver %d",pGrp->owner_id,pGrp->group_id,tmp_group_version))
1988 DeleteStoredGroup( pGrp->owner_id, pGrp->group_id );
1989 #ifdef INCLUDE_AU_PROFILE 1990 if ( !(pSGrp->crsl_usr_info.use_flags & USE_FROM_CAROUSEL) )
1992 pSGrp->status = FGS_PENDING;
1997 pSGrp->status = FGS_ACTIVE;
2001 tmp_group_size += size + MAX_MAN_HDR_SIZE;
2002 while (tmp_group_size + FileGroupTotalSize() > fg_nvm_max_limit)
2004 if ( !RemoveLeastDesiredGroup() )
break;
2007 pSGrp->next = stored_group_list;
2008 stored_group_list = pSGrp;
2023 static U32BIT SaveManifestFile(
const char *fname,
U8BIT *data,
U32BIT size, S_CarouselInfoFileGroup *pFG )
2030 char hdr_data[MAX_MAN_HDR_SIZE];
2032 TRACE(TDSMFG, (
" %s", fname))
2037 TRACE(TERROR, (
"STB_NVMOpenFile failed for %s", fname))
2049 pJM = fg_cache_members;
2052 pJM[2].
u.
p_str = &location;
2053 location.
zptr = pFG->location;
2054 location.
zlen = strlen((
char *) location.
zptr);
2059 hdr_data[hdr_size++] =
',';
2060 hdr_data[hdr_size++] =
'\n';
2062 hdr_data[hdr_size++] =
'\"';
2065 hdr_data[hdr_size++] =
'\"';
2066 hdr_data[hdr_size++] =
':';
2070 memcpy(hdr_data + hdr_size,
" ", 10);
2072 pCh = hdr_data + hdr_size - 1;
2077 *pCh =
'0' + (val % 10);
2083 hdr_data[hdr_size++] =
'\"';
2087 memcpy(hdr_data + hdr_size, pJM->
u.
p_str->
zptr, val);
2090 hdr_data[hdr_size++] =
'\"';
2096 hdr_data[hdr_size++] =
'\n';
2101 hdr_size += size + 2;
2105 TRACE(TERROR, (
"STB_NVMWriteFile failed for %s", fname))
2119 void ManifestLoadGood(
void *userData,
S_CONTENT *pContent )
2121 S_CarouselInfoFileGroup *pFG;
2123 S_STORED_GROUP *pSGrp;
2124 S_ManRequest *pManRqst;
2127 TRACE(TDSMFG, (
"##########################"));
2128 assert( fg_manifest_rqst != NULL );
2129 pFG = (S_CarouselInfoFileGroup *)userData;
2130 pManRqst = fg_manifest_rqst;
2131 while (pManRqst != NULL)
2133 if (pFG >= pManRqst->pFG && pFG < (pManRqst->pFG + pManRqst->total))
2137 pManRqst = pManRqst->next;
2139 if (pManRqst == NULL)
2141 TRACE(TERROR,(
"Manifest request not found"))
2145 assert( pManRqst->outstanding != 0 );
2146 pFgm = (S_FGManifest *)(pManRqst + 1);
2147 pFgm += pFG - pManRqst->pFG;
2148 pFgm->ormRqst = NULL;
2150 pSGrp = ParseManifestFile( pContent->data, pContent->size, pFG, pManRqst->hOC );
2154 SetFilename( pFG->owner_id, pFG->group_id, filename );
2155 if (pSGrp->status == FGS_LOADING)
2158 filename[0] += NAME_CHAR_OFFSET;
2160 size = SaveManifestFile( filename, pContent->data, pContent->size, pFG );
2163 FileGroupRemove( pSGrp );
2164 FileGroupFree( pSGrp );
2168 pSGrp->hOC = pManRqst->hOC;
2169 pSGrp->man_file_size = size;
2172 memcpy( pSGrp->dir_name, filename, 4 );
2173 memcpy( pSGrp->dir_name + 4, filename + 5, 4 );
2175 if (!(pSGrp->crsl_usr_info.use_flags & USE_FROM_CAROUSEL))
2177 LoadAllFileData( pSGrp, pManRqst->cachePriority );
2181 GetAllFileData( pSGrp, pManRqst->cachePriority );
2185 if (pContent->destroy)
2187 pContent->destroy( pContent->fs_handle );
2188 pContent->destroy = NULL;
2189 pContent->fs_handle = NULL;
2193 pManRqst->outstanding--;
2194 if (!pManRqst->outstanding)
2196 DSMCC_ClientUnloadFileGroups( pManRqst->dsmInst, pManRqst->hOC, pManRqst->pFG );
2207 void ManifestLoadFail(
void *userData )
2209 S_CarouselInfoFileGroup *pFG;
2211 S_ManRequest *pManRqst;
2212 TRACE(TDSMFG, (
"##########################"));
2213 assert( fg_manifest_rqst != NULL );
2214 pFG = (S_CarouselInfoFileGroup *)userData;
2215 pManRqst = fg_manifest_rqst;
2216 while (pManRqst != NULL)
2218 if (pFG >= pManRqst->pFG && pFG < (pManRqst->pFG + pManRqst->total))
2222 pManRqst = pManRqst->next;
2224 if (pManRqst == NULL)
2226 TRACE(TERROR,(
"Manifest request not found"))
2230 assert( pManRqst->outstanding != 0 );
2231 pFgm = (S_FGManifest *)(pManRqst + 1);
2232 pFgm += pFG - pManRqst->pFG;
2233 pFgm->ormRqst = NULL;
2236 pManRqst->outstanding--;
2237 if (!pManRqst->outstanding)
2239 DSMCC_ClientUnloadFileGroups( pManRqst->dsmInst, pManRqst->hOC, pManRqst->pFG );
2244 static void SwitchToNewStoredGroup(S_STORED_GROUP* pSGrp)
2246 S_STORED_GROUP* pOrigSG;
2253 assert(pSGrp->crsl_usr_info.owner_id <= MAX_SPECIAL_OWNER_ID && pSGrp->crsl_usr_info.group_id <= MAX_SPECIAL_GROUP_ID);
2255 SetFilename( pSGrp->crsl_usr_info.owner_id, pSGrp->crsl_usr_info.group_id, oldname );
2256 strcpy(newname,oldname);
2257 memcpy( olddir, oldname, 4 );
2258 memcpy( olddir+4, oldname+5, 4 );
2260 strcpy(newdir,olddir);
2262 pOrigSG = stored_group_list;
2263 while ( pOrigSG != NULL )
2265 if ( pOrigSG->crsl_usr_info.owner_id == pSGrp->crsl_usr_info.owner_id
2266 && pOrigSG->crsl_usr_info.group_id == pSGrp->crsl_usr_info.group_id )
2268 assert( memcmp(olddir,pOrigSG->dir_name,8) == 0 );
2269 newname[1] += NAME_CHAR_OFFSET;
2270 newdir[1] += NAME_CHAR_OFFSET;
2282 memcpy( pOrigSG->dir_name, newdir, 8 );
2284 newname[1] -= NAME_CHAR_OFFSET;
2285 newdir[1] -= NAME_CHAR_OFFSET;
2288 pOrigSG = pOrigSG->next;
2292 oldname[0] += NAME_CHAR_OFFSET;
2293 olddir[0] += NAME_CHAR_OFFSET;
2294 assert( memcmp(olddir,pSGrp->dir_name,8) == 0 );
2306 TRACE(TERROR,(
"failed to move to new Store group: %s",newdir))
2307 if (pOrigSG != NULL)
2310 oldname[0] -= NAME_CHAR_OFFSET;
2311 olddir[0] -= NAME_CHAR_OFFSET;
2312 newname[1] += NAME_CHAR_OFFSET;
2313 newdir[1] += NAME_CHAR_OFFSET;
2316 memcpy( pOrigSG->dir_name, olddir, 8 );
2318 DeleteAllFiles( pSGrp );
2319 FileGroupRemove( pSGrp );
2320 FileGroupFree( pSGrp );
2324 memcpy( pSGrp->dir_name, newname, 8 );
2325 pSGrp->status = FGS_ACTIVE;
2326 if (pOrigSG != NULL)
2328 DeleteAllFiles( pOrigSG );
2329 FileGroupRemove( pOrigSG );
2330 FileGroupFree( pOrigSG );
2345 static void FileLoadedGood(
void *userData,
S_CONTENT *pContent )
2347 S_DSM_FILE_RQST *pDsmRqst = (S_DSM_FILE_RQST *)userData;
2348 S_STORED_GROUP *pSGrp = pDsmRqst->sfg;
2353 TRACE(TDSMFG, (
"########### GOOD ###############"));
2361 TRACE(TERROR, (
"STB_NVMWriteFile failed for %s", pDsmRqst->fname))
2365 switch (pSGrp->status)
2369 if (size > MAX_SIZE_OF_CACHED_FILE)
2376 data =
DSMAlloc((size == 0) ? 1 : size );
2379 TRACE(TERROR, (
"malloc(%d)", size))
2386 TRACE(TDSMFG, (
"Using DSMCC content data"))
2387 *(pDsmRqst->pFgCtnt) = *pContent;
2389 pContent = pDsmRqst->pFgCtnt;
2399 memcpy(data, pContent->
data, size);
2408 pContent = pDsmRqst->pFgCtnt;
2409 pContent->
size = size;
2414 switch (pSGrp->status)
2418 if (!FulfilRequest( pContent, FS_STATUS_OK ))
2420 TRACE(TERROR,(
"Request not found for %s",pDsmRqst->fname))
2421 if (data == NULL && pContent->destroy != NULL)
2426 pContent->
data = NULL;
2431 if ( !HasMissingFileData(pSGrp) )
2433 SwitchToNewStoredGroup(pSGrp);
2437 if (!HasMissingFileData(pSGrp))
2439 pSGrp->status = FGS_ACTIVE;
2440 if (fg_request_head != NULL)
2442 FulfilOutstandingFileRequests( pSGrp, FS_STATUS_OK );
2457 static void FileLoadedFail(
void *userData )
2459 S_DSM_FILE_RQST *pDsmRqst = (S_DSM_FILE_RQST *)userData;
2460 S_STORED_GROUP *pSGrp = pDsmRqst->sfg;
2462 TRACE(TDSMFG, (
"########### FAIL ###############"));
2463 switch (pSGrp->status)
2466 FulfilRequest( pDsmRqst->pFgCtnt, FS_STATUS_ERROR );
2471 pSGrp->status = FGS_ERROR;
2472 if (fg_request_head != NULL)
2474 TRACE(TERROR, (
" status Error, use_flg 0x%x", pSGrp->crsl_usr_info.use_flags))
2475 FulfilOutstandingFileRequests( pSGrp, FS_STATUS_ERROR );
2480 pDsmRqst->pFgCtnt->user_data = NULL;
2481 DSMFree( pDsmRqst );
2487 static
void* NodesArray(
unsigned int val,
void *array,
void *gptr )
2489 S_STORED_GROUP *pSGrp;
2490 S_NODE *pNode = NULL;
2494 TRACE(TDSMFG, (
"Array FINISH"))
2498 TRACE(TERROR, ("Array ERROR"))
2505 pSGrp = (S_STORED_GROUP *)gptr;
2506 pSGrp->total_nodes = val;
2509 TRACE(TDSMFG,(
"Group has zero nodes - it will be deleted"))
2513 pNode =
DSMAlloc( val *
sizeof(S_NODE));
2516 memset(pNode, 0, val *
sizeof(S_NODE));
2519 pSGrp->nodes = pNode;
2520 tmp_node_filename.
zlen = 0;
2521 tmp_node_filename.
zptr = NULL;
2528 static void* NodeFinish(
unsigned int val,
void *array,
void *gptr )
2534 pNode = (S_NODE *)gptr;
2536 TRACE(TDSMFG, (
"File=%.*s", (
int)tmp_node_filename.
zlen, tmp_node_filename.
zptr))
2539 while (tmp_node_filename.zlen != 0 &&
2540 ((*tmp_node_filename.zptr == '/') || (*tmp_node_filename.zptr == '\\')))
2542 tmp_node_filename.
zptr++;
2543 tmp_node_filename.
zlen--;
2545 if (tmp_node_filename.
zlen != 0)
2547 if (tmp_node_count == 0)
2558 memcpy(pName, tmp_node_filename.
zptr, tmp_node_filename.
zlen);
2559 pName[tmp_node_filename.
zlen] = 0;
2560 pNode->nfname = pName;
2561 pNode->nflen = (
U16BIT)tmp_node_filename.
zlen;
2562 if (tmp_node_count == 0)
2564 memset( &(pNode->u.content), 0,
sizeof(
S_CONTENT));
2571 pName[tmp_node_filename.
zlen + 3] = 0;
2573 if (tmp_node_count > 999)
2575 tmp_node_count = 999;
2580 memset(pCtnt, 0, tmp_node_count *
sizeof(
S_CONTENT));
2581 pNode->count = (
U16BIT)tmp_node_count;
2582 pNode->u.contents = pCtnt;
2586 TRACE(TERROR, (
"malloc(%ld)", tmp_node_count *
sizeof(
S_CONTENT)))
2593 tmp_node_filename.
zptr = NULL;
U32BIT STB_OSGetClockMilliseconds(void)
Get Current Computer Clock Time.
void * STB_NVMOpenFile(U8BIT *name, E_STB_DSK_FILE_MODE mode)
Opens an existing file or creates a new one.
E_MhegErr VQ_PutMsg(S_MhegMessage *pMsg, E_PRIORITY priority)
Post event or section message on queue. Copies data into queue.
void FG_FactoryReset(void)
In the "factory reset", we clear all file groups from cache store. Then re-aquire file groups for the...
#define JSON_VALUE_FINISH
void STB_NVMCloseDirectory(void *dir)
Closes the directory for reading.
S_STRING MH5GlueStringCreate(U32BIT size, U8BIT *data)
union s_json_members::@9 u
E_JSON_STATE JSON_Parse(U8BIT *data, U32BIT size, const S_JSON_MEMBERS *members, void *usr)
File acceleration for Australia and Souh Africa.
Interface functions to DSM-CC instance for MHEG5.
E_MhegErr VT_TimerCreate(U32BIT millisecs, F_TimerCallback callback, void *callerRef, H_Timer *pTimerHandle)
Set a timer for a certain number of millseconds. When the timer expires a specified callback will be ...
MHEG5Bool MHEG5ResolveOrigin(MHEG5String *ref, E_FS_ORIGIN *pOrigin, MHEG5Int *offset)
Resolve the origin of a reference.
void FG_NotifyCarouselUnLoaded(H_ObjCarousel hOC)
Tell File Group that the Object Carousel has been unloaded, so all file groups on this carousel shoul...
MHEG5Bool MH5_SupportHDGraphics(void)
Returns whether supporting HD Graphics extension.
void FG_NotifyListChanged(S_DsmccEvent *param)
Tell File Group that File Groups have changed in Object Carousel's SRG User Info. ...
void * MHEG5FileOrmRetrieve(E_FS_ORIGIN origin, S_STRING location, S_STRING name, U16BIT priority, void *userData, F_CB_Good cbGood, F_CB_Fail cbFail)
Retrieve of a file. The file will be loaded and one of the callback functions called when request is ...
unsigned char * STR_DataAlloc(unsigned int size)
BOOLEAN STB_NVMMoveFile(U8BIT *oldname, U8BIT *newname)
Move/Rename a file or a directory. The original name and the new name may contain a path - the last e...
#define DECLARE_MEMBER(token_str, type, ptr, child_object)
E_FsStatus FG_LoadRequest(E_FS_ORIGIN origin, const char *fname, F_FS_CALLBACK cb_func, S_CONTENT *pContent, U8BIT cachePriority)
Request file from file group stores.
MHEG5Bool MH5_SupportPVRExtension(void)
Return whether PVR extension (ETSI, and originally NZ) is supported.
void * MHEG5_DsmccInstance(void)
Get the DSMCC instance handle.
void STB_NVMCloseFile(void *file)
Flushes and closes an open file.
void MH5GlueStringFree(S_STRING *pStr)
#define FRP_CACHE_DEFAULT
MHEG5Bool MH5_SupportICStreaming(void)
Return whether Interaction channel Streaming is supported.
BOOLEAN STB_NVMFileSize(U8BIT *filename, U32BIT *filesize)
Returns the size in KB of the given file.
void(* F_MSG_PROCESS)(void *data)
Function to Process voyager message.
void * STB_NVMOpenDirectory(U8BIT *dir_name)
Opens a directory in order to read the entries.
MHEG5Bool MH5_SupportHDVideo(void)
Returns whether supporting HD Video extension.
void STR_DataFree(unsigned char *data, unsigned int size)
Implement Functions to support Service Gateways. Functions for standarizing several GroupIDs like +DS...
U32BIT STB_NVMReadFile(void *file, U8BIT *data, U32BIT size)
Reads data from an open file.
MHEG5Bool MH5_SupportNativeApplication(void)
Return whether Native Application extension is supported.
#define MHEG5strncmp(a, b, n)
BOOLEAN STB_NVMReadDirectory(void *dir, U8BIT *filename, U16BIT filename_len, E_STB_DIR_ENTRY_TYPE *entry_type)
Reads the next entry from the directory, returning the name of the entry and the type of the entry...
MHEG5Bool MH5_SupportMhegProfile(E_MHEG_PROFILE profile)
Return whether Mheg profile (UK, NZ, AU, HK, SA, FREESAT) is currently supported. ...
File interface functions to DSMCC component.
string parsing utility functions described by the [JSON] schema
U32BIT STB_NVMWriteFile(void *file, U8BIT *data, U32BIT size)
Writes data to an open file.
The timer module allows the use of timers within the MHEG5 component. These timers can be set by othe...
void FG_Initialise(U32BIT nvmSize)
Initialise - retrieve data from NVM storage for any file groups and allocate the file group list...
MHEG5Bool MH5_SupportInteractionChannel(void)
Return whether Interaction channel is supported by current profile.
MHEG5Bool MH5_SupportServiceInfoExtension(void)
Return whether Service Info extension is supported.
void FG_Terminate(void)
Terminate - free data associated with all file groups.
MHEG5Bool MH5_SupportFontClass(void)
Return whether font class is supported by current profile.
void FG_NotifyVersionChanged(S_DsmccEvent *param)
Tell File Group of version changed for File Group(s) in Object Carousel's SRG User Info...
void FG_NotifyListLoaded(S_DsmccEvent *param)
Tell File Group that File Groups have loaded in Object Carousel's SRG User Info.
E_FsStatus FG_FileExists(E_FS_ORIGIN origin, const char *fname)
Request file from file group stores.
E_MhegErr VT_TimerDestroy(H_Timer timerHandle)
Destroy the specified timer. A callback will not be invoked for this timer after this function return...
Engine support utility functions for MHEG5.
#define DECLARE_OBJECT(cb_func)
BOOLEAN STB_NVMDeleteFile(U8BIT *filename)
Deletes the file.
Header file - Function prototypes for operating system.