38 #define DESCRIPTOR_STORED_GROUPS_TAG ((U8BIT) 0x80)
39 #define DESCRIPTOR_GROUP_LOCATION_TAG ((U8BIT) 0x81)
54 typedef struct FileGroupList_s
56 pFileGroupList_t next;
65 static pFileGroupList_t gOrphanFileGroups = NULL;
74 static void ClearFileGroups(
P_DsmCoreInst idp, pFileGroupList_t *ppFG )
84 if (pFG->clientCount != 0)
86 pFG->next = gOrphanFileGroups;
87 gOrphanFileGroups = pFG;
91 DSC_CmMemRelease( idp, pFG );
97 static U8BIT* SkipTaps( U8BIT *pData )
100 READ_UINT8( pData, count);
103 SET_POS_REL( pData, 6 );
104 READ_UINT8( pData, secLen );
105 SET_POS_REL( pData, (S32BIT)secLen );
110 static U8BIT* SkipServiceContexts( U8BIT *pData )
114 READ_UINT8(pData, count);
117 SET_POS_REL(pData, 4);
118 READ_UINT16(pData, ctxtLen);
119 SET_POS_REL(pData, ctxtLen);
224 dsmAssert((pOC->loadedObjectCount == 0));
226 if (pOC->root.pLoadRqst)
228 DSC_LoadRsqtDestroy( idp, pOC->root.pLoadRqst );
230 if (pOC->pFileGroupList != NULL)
232 ClearFileGroups( idp, &pOC->pFileGroupList );
235 LLDestroy( idp, &pOC->llcOcPostponedLiteObjectLoads);
236 LLDestroy( idp, &pOC->llcCurrObjects );
238 DSC_RootCrslFinalise( idp, &pOC->root );
241 DSC_CmMemRelease( idp, pOC );
242 *ppObjectCarousel = NULL;
244 dsmDP3((
"exit DSC_ObjCrslDestroy\n"));
247 static U16BIT CountFileGroups( U8BIT *pData, U16BIT uiLen, U16BIT *pDataSize )
250 U8BIT descTag, descLen;
253 while (uiLen > FG_HDR_LEN + 2)
255 READ_UINT8( pData, descTag);
256 READ_UINT8( pData, descLen);
260 dsmDP2((
"DATA ERROR: DSI User Info: UI_len=%u desc_len=%u\n", uiLen, descLen));
264 if (descTag == DESCRIPTOR_STORED_GROUPS_TAG)
266 while (descLen > FG_HDR_LEN)
270 SET_POS_REL( pData, FG_HDR_LEN );
271 READ_UINT8( pData, ui8 );
272 descLen -= FG_HDR_LEN + 1;
277 dsmDP2((
"DATA ERROR: DSI User Info: desc_len=%u priv data len=%u\n", descLen, ui8));
284 SET_POS_REL( pData, ui8 );
293 SET_POS_REL( pData, descLen );
299 static U8BIT* ParseGroupLocation( U8BIT *pData, U16BIT len, U8BIT *dataPtr )
301 U8BIT descTag, descLen;
304 READ_UINT8( pData, descTag);
305 READ_UINT8( pData, descLen);
309 dsmDP2((
"DATA ERROR: desc len too long: len=%u desc_len=%u\n", len, descLen));
313 if (descTag == DESCRIPTOR_GROUP_LOCATION_TAG)
317 READ_UINT8( pData, *dataPtr );
328 U8BIT descTag, descLen;
332 READ_UINT8( pData, descTag);
333 READ_UINT8( pData, descLen);
337 dsmDP2((
"DATA ERROR: DSI User Info: UI_len=%u desc_len=%u\n", uiLen, descLen));
341 if (descTag == DESCRIPTOR_STORED_GROUPS_TAG)
343 while (descLen > FG_HDR_LEN)
345 READ_UINT16( pData, pIFP->owner_id );
346 READ_UINT16( pData, pIFP->group_id );
347 READ_UINT8( pData, pIFP->group_priority );
348 READ_UINT8( pData, pIFP->use_flags );
349 READ_UINT8( pData, pIFP->receiver_profile );
350 READ_UINT8( pData, pIFP->group_version );
351 READ_UINT8( pData, ui8 );
352 descLen -= FG_HDR_LEN + 1;
353 pIFP->location = dataPtr;
358 dsmDP2((
"DATA ERROR: DSI User Info: desc_len=%u priv data len=%u\n", descLen, ui8));
362 dataPtr = ParseGroupLocation( pData, ui8, dataPtr );
364 SET_POS_REL( pData, ui8 );
368 DBG2(DD_OC,
"oid=0x%x gid=0x%x ver=%d", pIFP->owner_id, pIFP->group_id, pIFP->group_version)
375 SET_POS_REL( pData, descLen );
379 while (uiLen > FG_HDR_LEN + 2);
382 E_DscError DSC_ObjCrslRetrieveFileGroups(
P_ObjectCarousel pOC, U16BIT *total,
386 pFileGroupList_t pFG = pOC->pFileGroupList;
391 err = CLDSM_ERR_LOAD_FAILED;
396 *total = pFG->fgTotal;
405 pFileGroupList_t pFG;
406 pFileGroupList_t *ppFG;
410 pFG = (pFileGroupList_t)groups;
415 ppFG = &gOrphanFileGroups;
419 ppFG = &pOC->pFileGroupList;
423 if (pFG->clientCount != 0)
435 if (pFG->clientCount != 0)
439 if (!pFG->clientCount)
442 DSC_CmMemRelease(idp, pFG);
446 ppFG = &((*ppFG)->next);
454 E_FgChange result = FGC_NONE;
459 if (pOldIFP->owner_id != pNewIFP->owner_id ||
460 pOldIFP->group_id != pNewIFP->group_id )
462 DBG2(DD_OC,
"(%x,%x) (%x,%x)",
463 pOldIFP->owner_id,pOldIFP->group_id,
464 pNewIFP->owner_id,pNewIFP->group_id )
468 else if (pOldIFP->group_version != pNewIFP->group_version )
470 DBG2(DD_OC,
"(%x,%x) (%x,%x) oldver=%d newver=%d",
471 pOldIFP->owner_id, pOldIFP->group_id,
472 pNewIFP->owner_id, pNewIFP->group_id,
473 pOldIFP->group_version, pNewIFP->group_version )
481 U8BIT *pSrgData, U16BIT usrInfoLen )
484 pFileGroupList_t pOldFG, pNewFG;
486 U16BIT fgTotal, size, dataSize;
490 fgTotal = CountFileGroups(pSrgData, usrInfoLen, &dataSize);
491 pOldFG = pOC->pFileGroupList;
492 DBGLOG(DD_OC,
"fgTotal=%d", fgTotal);
494 pNewFG = (pFileGroupList_t)DSC_CmMemGet( idp, size );
497 ERRPRINT(
"Mem error")
498 err = CLDSM_ERR_MEM_HEAP_FULL;
503 memset( pNewFG, 0, size );
504 pNewFG->fgTotal = fgTotal;
505 pNewFG->dataSize = dataSize;
509 dataPtr = (U8BIT *)(fgListPtr + fgTotal);
510 ParseFileGroups( fgListPtr, pSrgData, usrInfoLen, dataPtr );
514 DBGLOG(DD_OC,
"pNewFG=%p", pNewFG);
515 pNewFG->next = pOC->pFileGroupList;
516 pOC->pFileGroupList = pNewFG;
518 pOC->root.status == RCS_LOADED &&
519 idp->setup.notifyCarouselLoadEventFunc != NULL)
521 idp->setup.notifyCarouselLoadEventFunc((H_DsmCarousel)pOC, OC_FILE_GROUP_LIST_CHANGE, pOC->root.rcid);
526 if (pOldFG->fgTotal != fgTotal)
534 if (fgchange != FGC_NONE)
536 DBGLOG(DD_OC,
"clientCount=%d", pOldFG->clientCount);
537 if (pOldFG->clientCount == 0)
540 pOC->pFileGroupList = pOldFG->next;
541 DSC_CmMemRelease(idp, pOldFG);
543 pNewFG->next = pOC->pFileGroupList;
544 pOC->pFileGroupList = pNewFG;
545 if ( idp->setup.notifyCarouselLoadEventFunc )
547 idp->setup.notifyCarouselLoadEventFunc( (H_DsmCarousel)pOC,
548 (fgchange == FGC_LIST)? OC_FILE_GROUP_LIST_CHANGE : OC_FILE_GROUP_VERS_CHANGE,
555 DSC_CmMemRelease(idp, pNewFG);
564 pFileGroupList_t pFGL;
565 dsmAssert(( pOC != NULL ));
566 dsmAssert(( pOC->root.status == RCS_LOADED ));
567 pFGL = pOC->pFileGroupList;
568 if (pFGL && pFGL->fgTotal != 0 && idp->setup.notifyCarouselLoadEventFunc != NULL)
570 idp->setup.notifyCarouselLoadEventFunc((H_DsmCarousel)pOC, OC_FILE_GROUP_LIST_LOADED, pOC->root.rcid);
576 U8BIT *pDsiPrivate, U16BIT dsiPrivateLen )
578 E_DscError err = CLDSM_OK;
585 dsmAssert((pDsiPrivate != NULL));
587 if (dsiPrivateLen < MIN_SRG_INFO_LEN)
589 ERRLOG(DD_OC,
"DATA ERROR: SRG short len=%u", dsiPrivateLen )
594 srgUsedLen = getIorInfoContig( pData, &iorTypeId, &srgLocation, &srgTap );
598 if (srgUsedLen == 0 || (iorTypeId != SRG_STR && iorTypeId != DIR_STR))
600 ERRLOG(DD_OC,
"DATA ERROR: Invalid IOR data for DSI, len=%u typ=%x", srgUsedLen, iorTypeId )
602 else if (srgLocation.carouselId != pOC->root.rcid)
604 ERRLOG(DD_OC,
"DATA ERROR: srgLocation.carouselId=%d tid=%d", srgLocation.carouselId, pOC->root.rcid )
608 U16BIT srgUserInfoLen;
610 dsmDP3((
"INFO: srgLocation.carouselId=%d\n", srgLocation.carouselId));
612 pData = SkipTaps( pData );
613 pData = SkipServiceContexts( pData );
615 READ_UINT16( pData, srgUserInfoLen );
616 if (pData + srgUserInfoLen != pDsiPrivate + dsiPrivateLen)
618 dsmDP2((
"DATA ERROR: DSI srg Info length error: %u - %u != %u\n",
619 dsiPrivateLen, pData - pDsiPrivate, srgUserInfoLen));
623 dsmDP3((
"INFO: pOC = 0x%p idp->pBootingCarousel = 0x%p\n", pOC, idp->pBootingCarousel));
624 if (idp->pBootingCarousel == &(pOC->root))
627 idp->pBootingCarousel = NULL;
629 ocUpdateSrgUserInfo( idp, pOC, pData, srgUserInfoLen );
631 err = lmUpdateCarouselSRGInfo( idp, pOC, &srgTap, &srgLocation );
642 E_DscError err = CLDSM_OK;
646 pDsmObject = LLHead( pOC->llcCurrObjects );
649 if (pDsmObject->objectDataSeq)
652 err = CDSM_CloseObject( idp, (
H_DsmObject)pDsmObject );
653 if (err != CLDSM_OK)
break;
656 if (err != CLDSM_OK)
break;
657 pDsmObject = LLHead( pOC->llcCurrObjects );
664 dsmAssert((pOC->srgObjectInfo.objectKind != DIR_STR));
665 return (pOC->srgObjectInfo.objectKind == SRG_STR && DSC_ObjCrslSrgModule(pOC))? TRUE : FALSE;
671 pDC = DSC_RootCrslFirstDataCarousel( &pOC->root );
672 return (pDC)? DSC_DataCrslFirstModule( pDC ) : NULL;
677 dsmAssert((pOC->root.magic == OC_MAGIC));
678 pOC->srgObjectInfo.objectKind = 0;
General include file for clDsm library internal definitions.
Header to the loadMgr module.
Header to the cacheMgr module.
E_DscError CDSM_UnloadObject(H_DsmCoreInst instance, H_DsmObject clDsmObjectHandle, E_DsmRstMode mode)
Unload (or cancel the requested load of) a DSM-CC object The client MUST first close and/or unsubscri...
Header to the object module - functions/methods accessing data of object messages inside modules...
Header to the objectCarousel module.
Header to the 'module' module - Functions/methods for creating/destroying and managing attributes of ...