DSMCC  17.9.0
 All Data Structures Files Functions Typedefs
dsm_client.c
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright © 2014 The DTVKit Open Software Foundation Ltd (www.dtvkit.org)
3  * Copyright © 2004 Ocean Blue Software Ltd
4  *
5  * This file is part of a DTVKit Software Component
6  * You are permitted to copy, modify or distribute this file subject to the terms
7  * of the DTVKit 1.0 Licence which can be found in licence.txt or at www.dtvkit.org
8  *
9  * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
10  * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES
11  * OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
12  *
13  * If you or your organisation is not a member of DTVKit then you have access
14  * to this source code outside of the terms of the licence agreement
15  * and you are expected to delete this and any associated files immediately.
16  * Further information on DTVKit, membership and terms can be found at www.dtvkit.org
17  *******************************************************************************/
24 /*---includes for this file--------------------------------------------------*/
25 #include <string.h>
26 
27 #include "stb_os.h"
28 #include "cldsmcc.h"
29 #include "fs_types.h"
30 #include "dsm_client.h"
31 #include "dm_debug.h"
32 #include "dsm_main.h"
33 
34 /*---constant definitions for this file--------------------------------------*/
35 
36 /* For a object type */
37 #define LOAD_FLAGS_REQUEST_OBJECT_TYPE 0x00100000
38 
39 /*---local typedef structs for this file-------------------------------------*/
40 
41 typedef struct s_DsmControl
42 {
43  S_DsmApi api;
44 } S_DsmControl;
45 
46 typedef struct s_DsmRefs
47 {
48  H_DsmCoreInst cldsm;
49  void *apimutex;
50  H_DsmObject dsmobj;
51  F_MemFree memFree;
52 } S_DsmRefs;
53 
54 typedef struct s_ObjUserData
55 {
56  H_DsmControl dsmctrl;
57  union
58  {
59  F_DSM_CBLOAD load;
60  F_DSM_TYPE type;
61  } cb;
62  U32BIT flags;
63  U32BIT size;
64  void *client_ud;
65 } S_ObjUserData;
66 
67 
68 /*---local (static) variable declarations for this file----------------------*/
69 
70 static U8BIT dummy_data[2] = {"\0\0"};
71 
72 /*---local function definitions----------------------------------------------*/
73 
74 static void UnloadObject( H_DsmControl dsmctrl, H_DsmObject dsmObj )
75 {
76  E_DscError cldsmErr;
77  DBGPRINT(DM_CLIENT, "( 0x%x )", dsmObj)
78  STB_OSMutexLock(dsmctrl->api.mutex);;
79  cldsmErr = CDSM_UnloadObject( dsmctrl->api.cldsm, dsmObj, RST_MODE_FORCE);
80  STB_OSMutexUnlock(dsmctrl->api.mutex);;
81  if (cldsmErr != CLDSM_OK)
82  {
83  ERRPRINT("clDsmUnloadObject: %d", cldsmErr)
84  }
85 }
86 
93 static void DsmccUnloadObject(void *obj)
94 {
95  H_DsmObject dsmObj = obj;
96  H_DsmCoreInst cldsm;
97  H_DsmControl dsmctrl;
98  E_DscError cldsmErr;
99  cldsm = CDSM_ObjectGetInstance(dsmObj);
100  if (cldsm == NULL)
101  {
102  ERRPRINT("invalid object: %p", dsmObj)
103  }
104  else
105  {
106  dsmctrl = CDSM_SysGetControl(cldsm);
107  if (dsmctrl == NULL)
108  {
109  ERRPRINT("invalid instance: %p", cldsm)
110  }
111  else
112  {
113  cldsmErr = CDSM_CloseObject(dsmctrl->api.cldsm, dsmObj);
114  if (cldsmErr)
115  {
116  DBGPRINT(DM_CLIENT, "%d", cldsmErr)
117  }
118  UnloadObject( dsmctrl, dsmObj );
119  }
120  }
121 }
122 
123 static void DsmccRefsFree( void *dsmRef )
124 {
125  S_DsmRefs *refs = dsmRef;
126  E_DscError cldsmErr;
127  STB_OSMutexLock(refs->apimutex);;
128  cldsmErr = CDSM_UnloadObject( refs->cldsm, refs->dsmobj, RST_MODE_FORCE);
129  STB_OSMutexUnlock(refs->apimutex);;
130  if (cldsmErr != CLDSM_OK)
131  {
132  ERRPRINT("clDsmUnloadObject: err=%d, %p, %p", cldsmErr, refs, refs->dsmobj)
133  }
134  refs->memFree(dsmRef);
135 }
136 
137 static
138 E_FsStatus StreamObjectQueryService( H_DsmControl dsmctrl, S_CONTENT *pContent, F_DSM_CBLOAD cb_func )
139 {
140  E_DscError cldsmErr;
141  S_DvbLocator *pDeferredService;
142  E_FsStatus ackStatus;
143  cldsmErr = CDSM_StreamGetDeferredService( dsmctrl->api.cldsm, pContent->fs_handle, pContent, cb_func, &pDeferredService );
144  switch (cldsmErr)
145  {
146  case CLDSM_PENDING:
147  ackStatus = FS_STATUS_PENDING;
148  break;
149 
150  default:
151  /*pDeferredService should be current service*/
152  /*fall through*/
153  case CLDSM_OK:
154  pContent->size = sizeof(S_DvbLocator);
155  pContent->data = (U8BIT *)pDeferredService;
156  ackStatus = FS_STATUS_OK;
157  break;
158  }
159  return ackStatus;
160 }
161 
162 static
163 E_FsStatus DirectoryListing( H_DsmControl dsmctrl, H_DsmObject objectHandle,
164  S_CONTENT *pContent, BOOLEAN incKind )
165 {
166  E_DscError err;
167  S_DsmRefs *refs;
168  U8BIT *data;
169  void *entry;
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)
176  {
177  if (incKind)
178  {
179  totalLen += count; /* add 'count' - for kind byte on each entry */
180  }
181  DBGPRINT(DM_CLIENT, " ttl=%d", totalLen)
182  refs = dsmctrl->api.memAlloc( sizeof(S_DsmRefs) + totalLen );
183  if (refs == NULL)
184  {
185  ERRPRINT("malloc failed %d", sizeof(S_DsmRefs) + totalLen)
186  }
187  else
188  {
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);
195  if (!err)
196  {
197  pContent->fs_handle = refs;
198  pContent->destroy = DsmccRefsFree;
199  data = (U8BIT *)(refs + 1);
200  pContent->data = data;
201  pContent->size = totalLen;
202  count--;
203  if (incKind)
204  {
205  *data = (U8BIT)(OBJECT_TYPE_UNKNOWN + (int)CDSM_DirEntryKind(entry));
206  data++;
207  }
208  data += CDSM_DirEntryNameCopy(entry, data) - 1;
209  while (count && CDSM_DirEntryNext(entry, &entry) == CLDSM_OK)
210  {
211  count--;
212  *data++ = ',';
213  if (incKind)
214  {
215  *data = (U8BIT)(OBJECT_TYPE_UNKNOWN + (int)CDSM_DirEntryKind(entry));
216  data++;
217  }
218  data += CDSM_DirEntryNameCopy(entry, data) - 1;
219  }
220  *data = 0;
221  ackStatus = FS_STATUS_OK;
222  }
223  else
224  {
225  ERRPRINT("err=%d", err)
226  dsmctrl->api.memFree(refs);
227  }
228  }
229  }
230  else
231  {
232  ERRPRINT("err=%d", err)
233  }
234  return ackStatus;
235 }
236 
237 static
238 E_FsStatus StreamEventListing( H_DsmControl dsmctrl, H_DsmObject objectHandle, S_CONTENT *pContent )
239 {
240  E_DscError err;
241  U8BIT *data;
242  U16BIT size;
243  E_FsStatus ackStatus = FS_STATUS_ERROR;
244 
245  err = CDSM_StreamEventNameList( dsmctrl->api.cldsm, objectHandle, &data, &size );
246  if (err == CLDSM_OK)
247  {
248  DBGPRINT(DM_CLIENT, "%p %p %d", objectHandle, data, size)
249  pContent->size = size;
250  pContent->data = data;
251  ackStatus = FS_STATUS_OK;
252  }
253  else
254  {
255  ERRPRINT("err=%d", err)
256  ackStatus = FS_STATUS_ERROR;
257  }
258  return ackStatus;
259 }
260 
261 static
262 E_FsStatus StreamEventXmldata( H_DsmControl dsmctrl, H_DsmObject objectHandle, S_CONTENT *pContent )
263 {
264  E_DscError err;
265  U8BIT *data;
266  U16BIT size;
267  E_FsStatus ackStatus = FS_STATUS_ERROR;
268 
269  err = CDSM_StreamEventXmlData( dsmctrl->api.cldsm, objectHandle, &data, &size );
270  if (err == CLDSM_OK)
271  {
272  DBGPRINT(DM_CLIENT, "%p %p %d", objectHandle, data, size)
273  pContent->size = size;
274  pContent->data = data;
275  ackStatus = FS_STATUS_OK;
276  }
277  else
278  {
279  ERRPRINT("err=%d", err)
280  ackStatus = FS_STATUS_ERROR;
281  }
282  return ackStatus;
283 }
284 
298 static E_FsStatus ReadObject( H_ObjUserData pUserData,
299  H_DsmObject objectHandle, S_CONTENT *pContent )
300 {
301  H_DsmControl dsmctrl = pUserData->dsmctrl;
302  U32BIT flags = pUserData->flags;
303  E_DscError cldsmErr;
304  E_DsmObjectKind kind;
305  E_FsStatus ackStatus;
306 
307  ASSERT( pContent->size == 0 );
308  ASSERT( pContent->data == NULL );
309  ASSERT( pContent->fs_handle == objectHandle );
310 
311  /* Read DSM object */
312  cldsmErr = CDSM_OpenObject( dsmctrl->api.cldsm, objectHandle, &kind );
313  if (cldsmErr == CLDSM_ERR_END_OF_DATA && kind == FILE_OBJ)
314  {
315  /* Zero-length file object */
316  DBGPRINT(DM_CLIENT, " zero length file")
317  pContent->size = 0;
318  pContent->data = dummy_data;
319  ackStatus = FS_STATUS_OK;
320  }
321  else if (cldsmErr)
322  {
323  ERRPRINT("clDsmOpenObject err=%d", cldsmErr)
324  ackStatus = FS_STATUS_ERROR;
325  }
326  else if ((flags & LOAD_FLAGS_REQUEST_FILE_ONLY_BIT) && (kind != FILE_OBJ))
327  {
328  ackStatus = FS_STATUS_NONE;
329  }
330  else
331  {
332  switch (kind)
333  {
334  case STREAM_OBJ_WITH_EVENTS:
335  if (flags & LOAD_FLAGS_REQUEST_EVENT_LIST_BIT)
336  {
337  ackStatus = StreamEventListing( dsmctrl, objectHandle, pContent );
338  break;
339  }
340  else if (flags & LOAD_FLAGS_REQUEST_STREAM_OBJ_XML_BIT)
341  {
342  ackStatus = StreamEventXmldata( dsmctrl, objectHandle, pContent );
343  break;
344  }
345  case STREAM_OBJ:
346  if (flags & LOAD_FLAGS_REQUEST_DEFERRED_SERVICE_BIT)
347  {
348  ackStatus = StreamObjectQueryService( dsmctrl, pContent, pUserData->cb.load );
349  }
350  else
351  {
352  ackStatus = FS_STATUS_NONE;
353  }
354  break;
355 
356  case FILE_OBJ:
357  cldsmErr = CDSM_FileDirect( objectHandle, &pContent->data, &pContent->size );
358  if (cldsmErr)
359  {
360  ERRPRINT("clDsmFiledirect: %d", cldsmErr)
361  pContent->data = NULL;
362  ackStatus = FS_STATUS_ERROR;
363  }
364  else
365  {
366  DBGPRINT(DM_CLIENT, "file len=%d", pContent->size)
367  ackStatus = FS_STATUS_OK;
368  }
369  break;
370 
371  case DIRECTORY_OBJ:
372  case SERVICE_GATEWAY_OBJ:
373  if (flags & LOAD_FLAGS_REQUEST_SERVICE_CONTEXT_BIT)
374  {
375  cldsmErr = CDSM_ObjectGetServiceContext( objectHandle, pUserData->size,
376  &pContent->data, &pContent->size );
377  if (cldsmErr == CLDSM_OK || cldsmErr == CLDSM_ERR_END_OF_DATA)
378  {
379  DBGPRINT(DM_CLIENT, "SRV CTXT len=%d", pContent->size)
380  ackStatus = FS_STATUS_OK;
381  }
382  else
383  {
384  ERRPRINT("%d", cldsmErr)
385  ackStatus = FS_STATUS_ERROR;
386  }
387  }
388  else if (flags & LOAD_FLAGS_REQUEST_DIRECTORY_LIST_BIT)
389  {
390  ackStatus = DirectoryListing( dsmctrl, objectHandle, pContent, TRUE );
391  DBGPRINT(DM_CLIENT, "DIR stat=%d len=%d", ackStatus, pContent->size)
392  }
393  else
394  {
395  ackStatus = DirectoryListing( dsmctrl, objectHandle, pContent, FALSE );
396  DBGPRINT(DM_CLIENT, "DIR stat=%d len=%d", ackStatus, pContent->size)
397  }
398  break;
399 
400  default:
401  ERRPRINT("kind=%d", kind)
402  ackStatus = FS_STATUS_ERROR;
403  }
404  if (kind != FILE_OBJ || cldsmErr)
405  {
406  cldsmErr = CDSM_CloseObject( dsmctrl->api.cldsm, objectHandle );
407  if (cldsmErr)
408  {
409  ERRPRINT("%d", cldsmErr)
410  }
411  }
412  }
413  return ackStatus;
414 }
415 
423 static E_FsStatus GetDsmObjectType( H_ObjUserData pUserData,
424  H_DsmObject objectHandle, E_DsmObjectType *pType )
425 {
426  H_DsmControl dsmctrl = pUserData->dsmctrl;
427  E_DscError cldsmErr;
428  E_DsmObjectKind kind;
429  E_FsStatus ackStatus;
430 
431  /* Read DSM object */
432  cldsmErr = CDSM_OpenObject( dsmctrl->api.cldsm, objectHandle, &kind );
433  if (cldsmErr == CLDSM_ERR_END_OF_DATA && kind == FILE_OBJ)
434  {
435  /* Zero-length file object */
436  *pType = OBJECT_TYPE_FILE;
437  ackStatus = FS_STATUS_OK;
438  DBGPRINT(DM_CLIENT, " zero length file")
439  }
440  else if (cldsmErr)
441  {
442  *pType = OBJECT_TYPE_UNKNOWN;
443  ackStatus = FS_STATUS_ERROR;
444  ERRPRINT("clDsmOpenObject err=%d", cldsmErr)
445  }
446  else
447  {
448  ackStatus = FS_STATUS_OK;
449  switch (kind)
450  {
451  case STREAM_OBJ_WITH_EVENTS:
452  {
453  *pType = OBJECT_TYPE_STREAM_WITH_EVENTS;
454  break;
455  }
456  case STREAM_OBJ:
457  {
458  *pType = OBJECT_TYPE_STREAM;
459  break;
460  }
461  case FILE_OBJ:
462  {
463  *pType = OBJECT_TYPE_FILE;
464  break;
465  }
466  case DIRECTORY_OBJ:
467  {
468  *pType = OBJECT_TYPE_DIRECTORY;
469  break;
470  }
471  case SERVICE_GATEWAY_OBJ:
472  {
473  *pType = OBJECT_TYPE_ROOT_DIR;
474  break;
475  }
476  default:
477  *pType = OBJECT_TYPE_UNKNOWN;
478  ackStatus = FS_STATUS_ERROR;
479  ERRPRINT("kind=%d", kind)
480  }
481  cldsmErr = CDSM_CloseObject( dsmctrl->api.cldsm, objectHandle );
482  if (cldsmErr)
483  {
484  ERRPRINT("%d", cldsmErr)
485  }
486  }
487  cldsmErr = CDSM_UnloadObject( dsmctrl->api.cldsm, objectHandle, RST_MODE_FORCE);
488  if (cldsmErr)
489  {
490  ERRPRINT("%d", cldsmErr)
491  }
492  return ackStatus;
493 }
494 
495 /*---global function definitions---------------------------------------------*/
496 
506 void DsmccObjectLoadEventFunc( H_DsmObject objectHandle, E_ObjLoadStatus status,
507  H_ObjUserData pUserData )
508 {
509 #ifndef NDEBUG
510  H_DsmControl dsmctrl = pUserData->dsmctrl;
511 #endif
512  E_FsStatus ackStatus;
513  S_CONTENT content;
514  E_DsmObjectType type;
515 
516  DBGPRINT(DM_CLIENT, "( 0x%x, %d, 0x%x )", objectHandle, status, pUserData)
517 
518  if (pUserData != NULL)
519  {
520  content.size = 0;
521  content.data = NULL;
522  content.user_data = pUserData->client_ud;
523  switch (status)
524  {
525  case OBJ_LOAD_COMPLETED:
526  {
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)
531  {
532  ackStatus = FS_STATUS_OK;
533  }
534  else if (pUserData->flags == LOAD_FLAGS_REQUEST_OBJECT_TYPE)
535  {
536  ackStatus = GetDsmObjectType( pUserData, objectHandle, &type );
537  }
538  else
539  {
540  ackStatus = ReadObject( pUserData, objectHandle, &content );
541  }
542  }
543  break;
544 
545  case OBJ_LOAD_ABORTED_UNLOAD:
546  /* object already unloaded, so destroy function should be NULL */
547  content.destroy = NULL;
548  content.fs_handle = NULL;
549  ackStatus = FS_STATUS_ABORT;
550  break;
551 
552  default:
553  /* load failed */
554  ERRPRINT("status %d", status)
555  content.destroy = NULL;
556  content.fs_handle = NULL;
557  ackStatus = FS_STATUS_ERROR;
558  }
559 
560  if (ackStatus != FS_STATUS_PENDING)
561  {
562  if (pUserData->flags == LOAD_FLAGS_REQUEST_OBJECT_TYPE)
563  {
564  pUserData->cb.type( content.user_data, type );
565  }
566  else
567  {
568  pUserData->cb.load( ackStatus, &content );
569  }
570  }
571  else
572  {
573  ERRPRINT("status PENDING!")
574  }
575  }
576 }
577 
578 void DsmccStreamEventFunc( H_DsmEvent eventHandle,
579  E_SENotifyStatus status, void *userData1, void *userData2,
580  U8BIT *namePtr, U8BIT *dataPtr, U8BIT nameLen, U8BIT dataLen )
581 {
582  F_DSM_EVENT cb_func = (F_DSM_EVENT)userData1;
583  if (status == SEN_TRIGGERED)
584  {
585  cb_func( userData2, namePtr, dataLen, dataPtr );
586  }
587 }
588 
624 E_FsStatus DSMCC_ClientLoadObject( H_DsmControl dsmctrl,
625  U8BIT *path, U32BIT flags, F_DSM_CBLOAD cb_func, S_CONTENT *pContent )
626 {
627  E_DscError cldsmErr = CLDSM_OK;
628  E_ObjLoadStatus objStatus;
629  H_DsmObject fileHandle = NULL;
630  E_FsStatus ackStatus;
631  E_CacheRules cachingRules;
632  S_ObjUserData oud;
633 
634  DBGPRINT(DM_CLIENT, "( %s, 0x%x, 0x%x )", path, cb_func, pContent )
635 
636  cachingRules = (E_CacheRules)(flags & LOAD_FLAGS_CACHE_PRIORITY_MASK);
637 
638  oud.dsmctrl = dsmctrl;
639  oud.flags = flags;
640  oud.cb.load = cb_func;
641  oud.size = pContent->size;
642  oud.client_ud = pContent->user_data;
643  pContent->size = 0;
644  pContent->data = NULL;
645 
646  STB_OSMutexLock(dsmctrl->api.mutex);
647 
648  if (cachingRules)
649  {
650  if ((cachingRules & 1) == 0)
651  {
652  cachingRules >>= 1;
653  /* Cache priority is even - this indicates that the object is static */
654  cachingRules |= CACHE_RULES_STATIC;
655  }
656  else if (cachingRules != 1)
657  {
658  cachingRules >>= 1;
659  }
660  }
661  else
662  {
663  cldsmErr = CDSM_SetObjectCachingRules( dsmctrl->api.cldsm, path, CACHE_RULES_FROM_STREAM );
664  }
665  cldsmErr = CDSM_LoadObject( dsmctrl->api.cldsm, path, 0,
666  cachingRules, &oud, sizeof(S_ObjUserData),
667  &objStatus, &fileHandle );
668 
669  pContent->destroy = DsmccUnloadObject;
670  pContent->fs_handle = (void *)fileHandle;
671 
672  STB_OSMutexUnlock(dsmctrl->api.mutex);
673 
674  if (cldsmErr)
675  {
676  ERRPRINT(" cldsmErr=%d", cldsmErr)
677  pContent->destroy = NULL;
678  pContent->fs_handle = NULL;
679  ackStatus = FS_STATUS_ERROR;
680  }
681  else
682  {
683  DBGPRINT(DM_CLIENT, " status=%d hdl=%p", objStatus, fileHandle )
684  switch (objStatus)
685  {
686  case OBJ_LOAD_IN_PROGRESS:
687  /* File load will return asynchronously */
688  ackStatus = FS_STATUS_PENDING;
689  break;
690 
691  case OBJ_LOAD_COMPLETED:
692  if (flags & LOAD_FLAGS_REQUEST_EXISTANCE_BIT)
693  {
694  ackStatus = FS_STATUS_OK;
695  break;
696  }
697  STB_OSMutexLock(dsmctrl->api.mutex);
698  ackStatus = ReadObject( &oud, fileHandle, pContent );
699  STB_OSMutexUnlock(dsmctrl->api.mutex);
700  if (ackStatus != FS_STATUS_ERROR)
701  {
702  break;
703  }
704  default:
705  ackStatus = FS_STATUS_ERROR;
706  UnloadObject(dsmctrl, fileHandle);
707  pContent->size = 0;
708  pContent->destroy = NULL;
709  pContent->fs_handle = NULL;
710  }
711  }
712  return ackStatus;
713 }
714 
725 E_FsStatus DSMCC_ClientObjectType( H_DsmControl dsmctrl, U8BIT *path,
726  F_DSM_TYPE cbfunc, void *userData, E_DsmObjectType *pType )
727 {
728  E_DscError cldsmErr = CLDSM_OK;
729  E_ObjLoadStatus objStatus;
730  H_DsmObject fileHandle = NULL;
731  E_FsStatus ackStatus;
732  S_ObjUserData oud;
733 
734  DBGPRINT(DM_CLIENT, "( %s, %p, %p )", path, cbfunc, pType )
735 
736  oud.dsmctrl = dsmctrl;
737  oud.cb.type = cbfunc;
738  oud.flags = LOAD_FLAGS_REQUEST_OBJECT_TYPE;
739  oud.size = 0;
740  oud.client_ud = userData;
741 
742  STB_OSMutexLock(dsmctrl->api.mutex);
743 
744  cldsmErr = CDSM_LoadObject( dsmctrl->api.cldsm, path, 0,
745  CACHE_RULES_DEFAULT, &oud, sizeof(S_ObjUserData),
746  &objStatus, &fileHandle );
747 
748  STB_OSMutexUnlock(dsmctrl->api.mutex);
749 
750  if (cldsmErr)
751  {
752  ERRPRINT(" cldsmErr=%d", cldsmErr)
753  ackStatus = FS_STATUS_ERROR;
754  *pType = OBJECT_TYPE_UNKNOWN;
755  }
756  else
757  {
758  DBGPRINT(DM_CLIENT, " status=%d hdl=%p", objStatus, fileHandle )
759  switch (objStatus)
760  {
761  case OBJ_LOAD_IN_PROGRESS:
762  /* object type will return asynchronously */
763  ackStatus = FS_STATUS_PENDING;
764  break;
765 
766  case OBJ_LOAD_COMPLETED:
767  STB_OSMutexLock(dsmctrl->api.mutex);
768  ackStatus = GetDsmObjectType( &oud, fileHandle, pType );
769  STB_OSMutexUnlock(dsmctrl->api.mutex);
770  if (cldsmErr)
771  {
772  ERRPRINT(" cldsmErr=%d", cldsmErr)
773  }
774  break;
775 
776  default:
777  ackStatus = FS_STATUS_ERROR;
778  *pType = OBJECT_TYPE_UNKNOWN;
779  UnloadObject(dsmctrl, fileHandle);
780  }
781  }
782  return ackStatus;
783 }
784 
792 void DSMCC_ClientPreloadHint( H_DsmControl dsmctrl, U8BIT *path )
793 {
794  E_DscError cldsmErr;
795 
796  STB_OSMutexLock(dsmctrl->api.mutex);
797 
798  cldsmErr = CDSM_PrefetchObject( dsmctrl->api.cldsm, path, 0 /* timeout */ );
799 
800  STB_OSMutexUnlock(dsmctrl->api.mutex);
801 
802  if (cldsmErr != CLDSM_OK)
803  {
804  ERRPRINT("ERROR: clDsmPrefetchObject returned %d", cldsmErr)
805  }
806 }
807 
829 E_FsStatus DSMCC_ClientEventSubscribeName( H_DsmControl dsmctrl,
830  FS_HANDLE streamObject, U8BIT *eventName,
831  F_DSM_EVENT cb_func, void *userData,
832  H_DsmEvent *pEventHandle )
833 {
834  E_DscError err;
835  E_FsStatus status;
836 
837  if (cb_func == NULL || pEventHandle == NULL)
838  {
839  status = FS_STATUS_ERROR;
840  }
841  else
842  {
843  STB_OSMutexLock(dsmctrl->api.mutex);
844 
845  err = CDSM_StreamEventSubscribe( dsmctrl->api.cldsm, streamObject, eventName,
846  cb_func, userData, pEventHandle );
847  STB_OSMutexUnlock(dsmctrl->api.mutex);
848  if (err == CLDSM_OK)
849  {
850  DBGPRINT(DM_CLIENT, " name=%s", eventName)
851  status = FS_STATUS_OK;
852  }
853  else
854  {
855  status = FS_STATUS_ERROR;
856  }
857  }
858  return status;
859 }
860 
878 E_FsStatus DSMCC_ClientEventSubscribeId( H_DsmControl dsmctrl,
879  U16BIT associationTag, U16BIT eventId,
880  F_DSM_EVENT cb_func, void *userData,
881  H_DsmEvent *pEventHandle )
882 {
883  E_DscError err;
884  E_FsStatus status;
885  if (cb_func == NULL || pEventHandle == NULL)
886  {
887  status = FS_STATUS_ERROR;
888  }
889  else
890  {
891  STB_OSMutexLock(dsmctrl->api.mutex);
892 
893  err = CDSM_SpecialEventSubscribe( dsmctrl->api.cldsm, associationTag, eventId,
894  cb_func, userData, pEventHandle );
895  STB_OSMutexUnlock(dsmctrl->api.mutex);
896  if (err == CLDSM_OK)
897  {
898  DBGPRINT(DM_CLIENT, " id=0x%x", eventId)
899  status = FS_STATUS_OK;
900  }
901  else
902  {
903  status = FS_STATUS_ERROR;
904  }
905  }
906  return status;
907 }
908 
915 void DSMCC_ClientEventUnsubscribe( H_DsmControl dsmctrl, H_DsmEvent eventHandle)
916 {
917  STB_OSMutexLock(dsmctrl->api.mutex);
918 
919  CDSM_StreamEventUnsubscribe( dsmctrl->api.cldsm, eventHandle );
920 
921  STB_OSMutexUnlock(dsmctrl->api.mutex);
922 }
923 
934 BOOLEAN DSMCC_ClientLoadFileGroups( H_DsmControl dsmctrl, H_ObjCarousel hOC,
935  U16BIT *total, S_CarouselInfoFileGroup **pGroups )
936 {
937  E_DscError err;
938  BOOLEAN result;
939 
940  STB_OSMutexLock(dsmctrl->api.mutex);
941 
942  err = CDSM_CarouselLoadFileGroups( dsmctrl->api.cldsm, hOC, total, pGroups );
943 
944  STB_OSMutexUnlock(dsmctrl->api.mutex);
945 
946  if (err == CLDSM_OK)
947  {
948  result = TRUE;
949  }
950  else
951  {
952  ERRPRINT("err=%d", err)
953  result = FALSE;
954  }
955 
956  return result;
957 }
958 
967 void DSMCC_ClientUnloadFileGroups( H_DsmControl dsmctrl, H_ObjCarousel hOC,
968  S_CarouselInfoFileGroup *groups )
969 {
970  E_DscError err;
971 
972  STB_OSMutexLock(dsmctrl->api.mutex);
973 
974  err = CDSM_CarouselUnloadFileGroups( dsmctrl->api.cldsm, hOC, groups );
975 
976  STB_OSMutexUnlock(dsmctrl->api.mutex);
977 
978  if (err != CLDSM_OK)
979  {
980  ERRPRINT("err=%d", err)
981  }
982 }
983 
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...
Definition: streamEvent.c:1279
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...
Definition: streamObject.c:141
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.
Definition: dsm_client.c:915
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...
Definition: streamEvent.c:1310
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 .
Definition: clDsmMain.c:532
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...
Definition: dsm_client.c:878
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.
Definition: dsm_client.c:967
File System types.
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...
Definition: dsm_client.h:122
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...
Definition: dsm_client.c:792
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.
Definition: dsm_client.h:130
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 ...
Definition: streamEvent.c:638
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...
Definition: dsm_client.c:506
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...
Definition: dsm_client.c:624
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...
Definition: streamEvent.c:329
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...
Definition: dsm_client.c:829
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...
Definition: dsm_client.c:725
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...
Definition: streamEvent.c:504
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...
Definition: dsm_client.c:934
Function prototypes for operating system.