37 #define LOAD_FLAGS_REQUEST_OBJECT_TYPE 0x00100000
41 typedef struct s_DsmControl
46 typedef struct s_DsmRefs
54 typedef struct s_ObjUserData
70 static U8BIT dummy_data[2] = {
"\0\0"};
74 static void UnloadObject( H_DsmControl dsmctrl,
H_DsmObject dsmObj )
77 DBGPRINT(DM_CLIENT,
"( 0x%x )", dsmObj)
81 if (cldsmErr != CLDSM_OK)
83 ERRPRINT(
"clDsmUnloadObject: %d", cldsmErr)
93 static void DsmccUnloadObject(
void *obj)
102 ERRPRINT(
"invalid object: %p", dsmObj)
109 ERRPRINT(
"invalid instance: %p", cldsm)
113 cldsmErr = CDSM_CloseObject(dsmctrl->api.cldsm, dsmObj);
116 DBGPRINT(DM_CLIENT,
"%d", cldsmErr)
118 UnloadObject( dsmctrl, dsmObj );
123 static void DsmccRefsFree(
void *dsmRef )
125 S_DsmRefs *refs = dsmRef;
130 if (cldsmErr != CLDSM_OK)
132 ERRPRINT(
"clDsmUnloadObject: err=%d, %p, %p", cldsmErr, refs, refs->dsmobj)
134 refs->memFree(dsmRef);
138 E_FsStatus StreamObjectQueryService( H_DsmControl dsmctrl,
S_CONTENT *pContent, F_DSM_CBLOAD cb_func )
142 E_FsStatus ackStatus;
147 ackStatus = FS_STATUS_PENDING;
155 pContent->data = (U8BIT *)pDeferredService;
156 ackStatus = FS_STATUS_OK;
163 E_FsStatus DirectoryListing( H_DsmControl dsmctrl,
H_DsmObject objectHandle,
170 U16BIT count, totalLen;
171 E_FsStatus ackStatus = FS_STATUS_ERROR;
172 DBGPRINT(DM_CLIENT,
"%p", objectHandle)
173 err = CDSM_DirEntrySizes(objectHandle, &count, &totalLen);
174 DBGPRINT(DM_CLIENT, " err=%d cnt=%d ttl=%d", err, count, totalLen)
175 if (!err && totalLen && count)
181 DBGPRINT(DM_CLIENT,
" ttl=%d", totalLen)
182 refs = dsmctrl->api.memAlloc( sizeof(S_DsmRefs) + totalLen );
185 ERRPRINT(
"malloc failed %d",
sizeof(S_DsmRefs) + totalLen)
189 DBGPRINT(DM_CLIENT,
"%p", refs)
190 refs->cldsm = dsmctrl->api.cldsm;
191 refs->apimutex = dsmctrl->api.mutex;
192 refs->memFree = dsmctrl->api.memFree;
193 refs->dsmobj = objectHandle;
194 err = CDSM_DirEntryFirst(objectHandle, &entry);
197 pContent->fs_handle = refs;
198 pContent->destroy = DsmccRefsFree;
199 data = (U8BIT *)(refs + 1);
200 pContent->data = data;
201 pContent->size = totalLen;
205 *data = (U8BIT)(OBJECT_TYPE_UNKNOWN + (
int)CDSM_DirEntryKind(entry));
208 data += CDSM_DirEntryNameCopy(entry, data) - 1;
209 while (count && CDSM_DirEntryNext(entry, &entry) == CLDSM_OK)
215 *data = (U8BIT)(OBJECT_TYPE_UNKNOWN + (
int)CDSM_DirEntryKind(entry));
218 data += CDSM_DirEntryNameCopy(entry, data) - 1;
221 ackStatus = FS_STATUS_OK;
225 ERRPRINT(
"err=%d", err)
226 dsmctrl->api.memFree(refs);
232 ERRPRINT(
"err=%d", err)
238 E_FsStatus StreamEventListing( H_DsmControl dsmctrl,
H_DsmObject objectHandle,
S_CONTENT *pContent )
243 E_FsStatus ackStatus = FS_STATUS_ERROR;
248 DBGPRINT(DM_CLIENT,
"%p %p %d", objectHandle, data, size)
249 pContent->size = size;
250 pContent->data = data;
251 ackStatus = FS_STATUS_OK;
255 ERRPRINT(
"err=%d", err)
256 ackStatus = FS_STATUS_ERROR;
262 E_FsStatus StreamEventXmldata( H_DsmControl dsmctrl,
H_DsmObject objectHandle,
S_CONTENT *pContent )
267 E_FsStatus ackStatus = FS_STATUS_ERROR;
272 DBGPRINT(DM_CLIENT,
"%p %p %d", objectHandle, data, size)
273 pContent->size = size;
274 pContent->data = data;
275 ackStatus = FS_STATUS_OK;
279 ERRPRINT(
"err=%d", err)
280 ackStatus = FS_STATUS_ERROR;
298 static E_FsStatus ReadObject( H_ObjUserData pUserData,
301 H_DsmControl dsmctrl = pUserData->dsmctrl;
302 U32BIT flags = pUserData->flags;
304 E_DsmObjectKind kind;
305 E_FsStatus ackStatus;
307 ASSERT( pContent->size == 0 );
308 ASSERT( pContent->data == NULL );
309 ASSERT( pContent->fs_handle == objectHandle );
313 if (cldsmErr == CLDSM_ERR_END_OF_DATA && kind == FILE_OBJ)
316 DBGPRINT(DM_CLIENT,
" zero length file")
318 pContent->data = dummy_data;
319 ackStatus = FS_STATUS_OK;
323 ERRPRINT(
"clDsmOpenObject err=%d", cldsmErr)
324 ackStatus = FS_STATUS_ERROR;
326 else if ((flags & LOAD_FLAGS_REQUEST_FILE_ONLY_BIT) && (kind != FILE_OBJ))
328 ackStatus = FS_STATUS_NONE;
334 case STREAM_OBJ_WITH_EVENTS:
335 if (flags & LOAD_FLAGS_REQUEST_EVENT_LIST_BIT)
337 ackStatus = StreamEventListing( dsmctrl, objectHandle, pContent );
340 else if (flags & LOAD_FLAGS_REQUEST_STREAM_OBJ_XML_BIT)
342 ackStatus = StreamEventXmldata( dsmctrl, objectHandle, pContent );
346 if (flags & LOAD_FLAGS_REQUEST_DEFERRED_SERVICE_BIT)
348 ackStatus = StreamObjectQueryService( dsmctrl, pContent, pUserData->cb.load );
352 ackStatus = FS_STATUS_NONE;
357 cldsmErr = CDSM_FileDirect( objectHandle, &pContent->data, &pContent->size );
360 ERRPRINT(
"clDsmFiledirect: %d", cldsmErr)
361 pContent->data = NULL;
362 ackStatus = FS_STATUS_ERROR;
366 DBGPRINT(DM_CLIENT,
"file len=%d", pContent->size)
367 ackStatus = FS_STATUS_OK;
372 case SERVICE_GATEWAY_OBJ:
373 if (flags & LOAD_FLAGS_REQUEST_SERVICE_CONTEXT_BIT)
376 &pContent->data, &pContent->size );
377 if (cldsmErr == CLDSM_OK || cldsmErr == CLDSM_ERR_END_OF_DATA)
379 DBGPRINT(DM_CLIENT,
"SRV CTXT len=%d", pContent->size)
380 ackStatus = FS_STATUS_OK;
384 ERRPRINT(
"%d", cldsmErr)
385 ackStatus = FS_STATUS_ERROR;
388 else if (flags & LOAD_FLAGS_REQUEST_DIRECTORY_LIST_BIT)
390 ackStatus = DirectoryListing( dsmctrl, objectHandle, pContent, TRUE );
391 DBGPRINT(DM_CLIENT,
"DIR stat=%d len=%d", ackStatus, pContent->size)
395 ackStatus = DirectoryListing( dsmctrl, objectHandle, pContent, FALSE );
396 DBGPRINT(DM_CLIENT,
"DIR stat=%d len=%d", ackStatus, pContent->size)
401 ERRPRINT(
"kind=%d", kind)
402 ackStatus = FS_STATUS_ERROR;
404 if (kind != FILE_OBJ || cldsmErr)
406 cldsmErr = CDSM_CloseObject( dsmctrl->api.cldsm, objectHandle );
409 ERRPRINT(
"%d", cldsmErr)
423 static E_FsStatus GetDsmObjectType( H_ObjUserData pUserData,
426 H_DsmControl dsmctrl = pUserData->dsmctrl;
428 E_DsmObjectKind kind;
429 E_FsStatus ackStatus;
433 if (cldsmErr == CLDSM_ERR_END_OF_DATA && kind == FILE_OBJ)
436 *pType = OBJECT_TYPE_FILE;
437 ackStatus = FS_STATUS_OK;
438 DBGPRINT(DM_CLIENT,
" zero length file")
442 *pType = OBJECT_TYPE_UNKNOWN;
443 ackStatus = FS_STATUS_ERROR;
444 ERRPRINT(
"clDsmOpenObject err=%d", cldsmErr)
448 ackStatus = FS_STATUS_OK;
451 case STREAM_OBJ_WITH_EVENTS:
453 *pType = OBJECT_TYPE_STREAM_WITH_EVENTS;
458 *pType = OBJECT_TYPE_STREAM;
463 *pType = OBJECT_TYPE_FILE;
468 *pType = OBJECT_TYPE_DIRECTORY;
471 case SERVICE_GATEWAY_OBJ:
473 *pType = OBJECT_TYPE_ROOT_DIR;
477 *pType = OBJECT_TYPE_UNKNOWN;
478 ackStatus = FS_STATUS_ERROR;
479 ERRPRINT(
"kind=%d", kind)
481 cldsmErr = CDSM_CloseObject( dsmctrl->api.cldsm, objectHandle );
484 ERRPRINT(
"%d", cldsmErr)
490 ERRPRINT(
"%d", cldsmErr)
507 H_ObjUserData pUserData )
510 H_DsmControl dsmctrl = pUserData->dsmctrl;
512 E_FsStatus ackStatus;
514 E_DsmObjectType type;
516 DBGPRINT(DM_CLIENT,
"( 0x%x, %d, 0x%x )", objectHandle, status, pUserData)
518 if (pUserData != NULL)
522 content.user_data = pUserData->client_ud;
525 case OBJ_LOAD_COMPLETED:
527 content.destroy = DsmccUnloadObject;
528 content.fs_handle = objectHandle;
529 DBGPRINT(DM_CLIENT,
"object loaded; flgs=%x", pUserData->flags)
530 if (pUserData->flags & LOAD_FLAGS_REQUEST_EXISTANCE_BIT)
532 ackStatus = FS_STATUS_OK;
534 else if (pUserData->flags == LOAD_FLAGS_REQUEST_OBJECT_TYPE)
536 ackStatus = GetDsmObjectType( pUserData, objectHandle, &type );
540 ackStatus = ReadObject( pUserData, objectHandle, &content );
545 case OBJ_LOAD_ABORTED_UNLOAD:
547 content.destroy = NULL;
548 content.fs_handle = NULL;
549 ackStatus = FS_STATUS_ABORT;
554 ERRPRINT(
"status %d", status)
555 content.destroy = NULL;
556 content.fs_handle = NULL;
557 ackStatus = FS_STATUS_ERROR;
560 if (ackStatus != FS_STATUS_PENDING)
562 if (pUserData->flags == LOAD_FLAGS_REQUEST_OBJECT_TYPE)
564 pUserData->cb.type( content.user_data, type );
568 pUserData->cb.load( ackStatus, &content );
573 ERRPRINT(
"status PENDING!")
578 void DsmccStreamEventFunc( H_DsmEvent eventHandle,
579 E_SENotifyStatus status,
void *userData1,
void *userData2,
580 U8BIT *namePtr, U8BIT *dataPtr, U8BIT nameLen, U8BIT dataLen )
583 if (status == SEN_TRIGGERED)
585 cb_func( userData2, namePtr, dataLen, dataPtr );
625 U8BIT *path, U32BIT flags, F_DSM_CBLOAD cb_func,
S_CONTENT *pContent )
627 E_DscError cldsmErr = CLDSM_OK;
628 E_ObjLoadStatus objStatus;
630 E_FsStatus ackStatus;
631 E_CacheRules cachingRules;
634 DBGPRINT(DM_CLIENT,
"( %s, 0x%x, 0x%x )", path, cb_func, pContent )
636 cachingRules = (E_CacheRules)(flags & LOAD_FLAGS_CACHE_PRIORITY_MASK);
638 oud.dsmctrl = dsmctrl;
640 oud.cb.load = cb_func;
641 oud.size = pContent->size;
642 oud.client_ud = pContent->user_data;
644 pContent->data = NULL;
650 if ((cachingRules & 1) == 0)
654 cachingRules |= CACHE_RULES_STATIC;
656 else if (cachingRules != 1)
663 cldsmErr = CDSM_SetObjectCachingRules( dsmctrl->api.cldsm, path, CACHE_RULES_FROM_STREAM );
665 cldsmErr = CDSM_LoadObject( dsmctrl->api.cldsm, path, 0,
666 cachingRules, &oud,
sizeof(S_ObjUserData),
667 &objStatus, &fileHandle );
669 pContent->destroy = DsmccUnloadObject;
670 pContent->fs_handle = (
void *)fileHandle;
676 ERRPRINT(
" cldsmErr=%d", cldsmErr)
677 pContent->destroy = NULL;
678 pContent->fs_handle = NULL;
679 ackStatus = FS_STATUS_ERROR;
683 DBGPRINT(DM_CLIENT,
" status=%d hdl=%p", objStatus, fileHandle )
686 case OBJ_LOAD_IN_PROGRESS:
688 ackStatus = FS_STATUS_PENDING;
691 case OBJ_LOAD_COMPLETED:
692 if (flags & LOAD_FLAGS_REQUEST_EXISTANCE_BIT)
694 ackStatus = FS_STATUS_OK;
698 ackStatus = ReadObject( &oud, fileHandle, pContent );
700 if (ackStatus != FS_STATUS_ERROR)
705 ackStatus = FS_STATUS_ERROR;
706 UnloadObject(dsmctrl, fileHandle);
708 pContent->destroy = NULL;
709 pContent->fs_handle = NULL;
726 F_DSM_TYPE cbfunc,
void *userData, E_DsmObjectType *pType )
728 E_DscError cldsmErr = CLDSM_OK;
729 E_ObjLoadStatus objStatus;
731 E_FsStatus ackStatus;
734 DBGPRINT(DM_CLIENT,
"( %s, %p, %p )", path, cbfunc, pType )
736 oud.dsmctrl = dsmctrl;
737 oud.cb.type = cbfunc;
738 oud.flags = LOAD_FLAGS_REQUEST_OBJECT_TYPE;
740 oud.client_ud = userData;
744 cldsmErr = CDSM_LoadObject( dsmctrl->api.cldsm, path, 0,
745 CACHE_RULES_DEFAULT, &oud,
sizeof(S_ObjUserData),
746 &objStatus, &fileHandle );
752 ERRPRINT(
" cldsmErr=%d", cldsmErr)
753 ackStatus = FS_STATUS_ERROR;
754 *pType = OBJECT_TYPE_UNKNOWN;
758 DBGPRINT(DM_CLIENT,
" status=%d hdl=%p", objStatus, fileHandle )
761 case OBJ_LOAD_IN_PROGRESS:
763 ackStatus = FS_STATUS_PENDING;
766 case OBJ_LOAD_COMPLETED:
768 ackStatus = GetDsmObjectType( &oud, fileHandle, pType );
772 ERRPRINT(
" cldsmErr=%d", cldsmErr)
777 ackStatus = FS_STATUS_ERROR;
778 *pType = OBJECT_TYPE_UNKNOWN;
779 UnloadObject(dsmctrl, fileHandle);
798 cldsmErr = CDSM_PrefetchObject( dsmctrl->api.cldsm, path, 0 );
802 if (cldsmErr != CLDSM_OK)
804 ERRPRINT(
"ERROR: clDsmPrefetchObject returned %d", cldsmErr)
830 FS_HANDLE streamObject, U8BIT *eventName,
832 H_DsmEvent *pEventHandle )
837 if (cb_func == NULL || pEventHandle == NULL)
839 status = FS_STATUS_ERROR;
846 cb_func, userData, pEventHandle );
850 DBGPRINT(DM_CLIENT,
" name=%s", eventName)
851 status = FS_STATUS_OK;
855 status = FS_STATUS_ERROR;
879 U16BIT associationTag, U16BIT eventId,
881 H_DsmEvent *pEventHandle )
885 if (cb_func == NULL || pEventHandle == NULL)
887 status = FS_STATUS_ERROR;
894 cb_func, userData, pEventHandle );
898 DBGPRINT(DM_CLIENT,
" id=0x%x", eventId)
899 status = FS_STATUS_OK;
903 status = FS_STATUS_ERROR;
952 ERRPRINT(
"err=%d", err)
980 ERRPRINT(
"err=%d", err)
E_DscError CDSM_StreamEventNameList(H_DsmCoreInst dsmccInstance, H_DsmObject streamObject, U8BIT **pNamesPtr, U16BIT *pNamesLen)
The Client uses this function to request list of event names for stream object Before calling this fu...
E_DscError CDSM_StreamGetDeferredService(H_DsmCoreInst instance, H_DsmObject streamObject, void *userData1, void *userData2, S_DvbLocator **ppDeferredService)
The Client calls this function to obtain the Association Tag which can be used to determine the PID o...
E_DscError CDSM_CarouselUnloadFileGroups(H_DsmCoreInst instance, H_DsmCarousel clDsmCarouselHandle, S_CarouselInfoFileGroup *groups)
Release "File Group Info" data allocated by used by CDSM_CarouselLoadFileGroups() ...
H_DsmCoreInst CDSM_ObjectGetInstance(H_DsmObject clDsmObjectHandle)
Get DSM instance to which the object belongs.
void DSMCC_ClientEventUnsubscribe(H_DsmControl dsmctrl, H_DsmEvent eventHandle)
Client request to UN-subscribe to DSMCC Stream Event.
E_DscError CDSM_StreamEventXmlData(H_DsmCoreInst dsmccInstance, H_DsmObject streamObject, U8BIT **ppXmlData, U16BIT *pXmlLen)
The Client uses this function to request data in XML format for stream object and associated events...
E_DscError CDSM_CarouselLoadFileGroups(H_DsmCoreInst instance, H_DsmCarousel clDsmCarouselHandle, U16BIT *total, S_CarouselInfoFileGroup **pGroups)
Retrieve from Object Carousel's User Info, the "File Group Info" used by Australia and South Africa M...
H_DsmControl CDSM_SysGetControl(H_DsmCoreInst instance)
Get control handle from DSM instance .
E_FsStatus DSMCC_ClientEventSubscribeId(H_DsmControl dsmctrl, U16BIT associationTag, U16BIT eventId, F_DSM_EVENT cb_func, void *userData, H_DsmEvent *pEventHandle)
Client request to subscribe to DSMCC Stream Event, specified by event ID and association tag of strea...
Internal header for DSM-CC control module.
void DSMCC_ClientUnloadFileGroups(H_DsmControl dsmctrl, H_ObjCarousel hOC, S_CarouselInfoFileGroup *groups)
Client request to release file group data returned from DSMCC_ClientLoadFileGroups.
void STB_OSMutexUnlock(void *mutex)
Unlock a mutex (a.k.a. 'leave', 'signal' or 'release')
DSM-CC API for client requests.
void(* F_DSM_EVENT)(void *userData, U8BIT *name, U32BIT dataLen, U8BIT *dataPtr)
Callback function to notify that a DSM-CC stream event has triggered The event name is given...
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...
void DSMCC_ClientPreloadHint(H_DsmControl dsmctrl, U8BIT *path)
Provide a hint that the specified file may be required in the future. If possible this should be load...
Main API to DSM-CC core layer (provided functions and required callbacks).
void(* F_DSM_TYPE)(void *userData, E_DsmObjectType type)
Callback function to notify client of result for request of object type.
E_DscError CDSM_OpenObject(H_DsmCoreInst instance, H_DsmObject clDsmObjectHandle, E_DsmObjectKind *pKind)
Open object data for subsequent access via API functions for given object kind. The object must have ...
E_DscError CDSM_StreamEventUnsubscribe(H_DsmCoreInst dsmccInstance, H_DsmEvent eventHandle)
This function is called by the Client to let DSMCC know when a previously subscribed stream event is ...
void STB_OSMutexLock(void *mutex)
Lock a mutex (a.k.a. 'enter', 'wait' or 'get').
void DsmccObjectLoadEventFunc(H_DsmObject objectHandle, E_ObjLoadStatus status, H_ObjUserData pUserData)
Callback function provided to DSM-CC library. Object load events are passed to this callback by the D...
E_FsStatus DSMCC_ClientLoadObject(H_DsmControl dsmctrl, U8BIT *path, U32BIT flags, F_DSM_CBLOAD cb_func, S_CONTENT *pContent)
Perform a file load request which is executed synchronously or asynchronously. See load flags above f...
E_DscError CDSM_StreamEventSubscribe(H_DsmCoreInst dsmccInstance, H_DsmObject streamObject, U8BIT *eventName, void *userData1, void *userData2, H_DsmEvent *pEventHandle)
The Client uses this function to request that the DSMCC notifies it when a named stream event occurs...
E_FsStatus DSMCC_ClientEventSubscribeName(H_DsmControl dsmctrl, FS_HANDLE streamObject, U8BIT *eventName, F_DSM_EVENT cb_func, void *userData, H_DsmEvent *pEventHandle)
Client request to subscribe to DSMCC Stream Event, specified by name. DSMCC notifies when the named s...
E_DscError CDSM_ObjectGetServiceContext(H_DsmObject clDsmObjectHandle, U32BIT serviceId, U8BIT **pSrvCtxtData, U32BIT *pSrvCtxtLen)
This function gets service context of DSM object (if available) Need by MHEG5 for specified service g...
E_FsStatus DSMCC_ClientObjectType(H_DsmControl dsmctrl, U8BIT *path, F_DSM_TYPE cbfunc, void *userData, E_DsmObjectType *pType)
Request object type for given path. This may be executed synchronously or asynchronously - see commen...
E_DscError CDSM_SpecialEventSubscribe(H_DsmCoreInst dsmccInstance, U16BIT associationTag, U16BIT eventId, void *userData1, void *userData2, H_DsmEvent *pEventHandle)
Like clDsmStreamEventSubscribe, except that no stream object is required. This function subscribes to...
BOOLEAN DSMCC_ClientLoadFileGroups(H_DsmControl dsmctrl, H_ObjCarousel hOC, U16BIT *total, S_CarouselInfoFileGroup **pGroups)
Client request to retrieve MHEG5 File system acceleration file groups The client must release the arr...
Function prototypes for operating system.