39 #ifdef COMMON_INTERFACE 40 #include "ci_appmmi.h" 63 #ifdef PRINT_DSM_FILES 66 #include "dsm_control.h" 67 void DBG_FilePrintf(
const char *format, ...);
69 #ifdef SAVING_DSM_FILES 72 #include "dsm_control.h" 73 void DBG_SaveFile(
unsigned int srv_ndx,
unsigned int srv_id,
unsigned int crsl_id,
74 char *name,
unsigned char *data,
unsigned int len);
79 #define MAX_PATHNAME_LENGTH (1024) 81 #ifndef MAX_CI_REQUESTS 82 #define MAX_CI_REQUESTS (1) 84 #define CI_ACK_TIMEOUT 9999 86 #define MIN_HTTP_REPLY_BLOCK (128) 87 #define MAX_REDIRECTS (5) 90 #define DsmAlloc AllocRequest 92 #define DsmAlloc AllocNothing 95 #ifdef COMMON_INTERFACE 96 #define CiAlloc AllocRequest 98 #define CiAlloc AllocNothing 102 #define HttpAlloc AllocRequest 103 #define HybrAlloc AllocRequest 105 #define HttpAlloc AllocNothing 106 #define HybrAlloc AllocNothing 110 #define DEFAULT_ORIGIN ORIGIN_HYBRID 113 #define DEFAULT_ORIGIN ORIGIN_DSM 115 #define DEFAULT_ORIGIN ORIGIN_CI 119 #define IS_HTTP_REQUEST(r) ((r)->origin == ORIGIN_HTTP || (r)->origin == ORIGIN_HTTPS) 120 #define IS_HTTPS_REQUEST(r) ((r)->origin == ORIGIN_HTTPS) 121 #define IS_HYBRID_REQUSET(r) ((r)->origin == ORIGIN_HYBRID) 124 #define CHECK_ORM_MAGIC 126 #ifdef CHECK_ORM_MAGIC 127 #define ORM_REQUEST_MAGIC 0xdeadbeef 128 #define ORM_REQUEST_BAD_MAGIC 0xfeedface 129 #define SET_ORM_MAGIC(r) (r)->magic = ORM_REQUEST_MAGIC 130 #define CLEAR_ORM_MAGIC(r) (r)->magic = ORM_REQUEST_BAD_MAGIC 131 #define VERIFY_ORM_MAGIC(r) assert((r)->magic == ORM_REQUEST_MAGIC) 133 #define SET_ORM_MAGIC(r) 134 #define CLEAR_ORM_MAGIC(r) 135 #define VERIFY_ORM_MAGIC(r) 140 #define PRINT_ERROR(x) TPRINT(TERROR, x) 144 #define PRINT_ERROR(x) 148 #define ORM_STATE_STRING(r) \ 149 ((r)->state == ORM_STATE_START ? "ORM_STATE_START" : \ 150 (r)->state == ORM_STATE_QUEUED ? "ORM_STATE_QUEUED" : \ 151 (r)->state == ORM_STATE_WAIT_ACCESS ? "ORM_STATE_WAIT_ACCESS" : \ 152 (r)->state == ORM_STATE_CHECK_ACCESS ? "ORM_STATE_WAIT_ACCESS" : \ 153 (r)->state == ORM_STATE_HAS_ACCESS ? "ORM_STATE_HAS_ACCESS" : \ 154 (r)->state == ORM_STATE_WAIT_CERT ? "ORM_STATE_WAIT_CERT" : \ 155 (r)->state == ORM_STATE_HAS_CERT ? "ORM_STATE_HAS_CERT" : \ 156 (r)->state == ORM_STATE_REQUESTED ? "ORM_STATE_REQUESTED" : \ 157 (r)->state == ORM_STATE_WAIT_VERIFY ? "ORM_STATE_WAIT_VERIFY" : \ 158 (r)->state == ORM_STATE_CHECK_VERIFY ? "ORM_STATE_CHECK_VERIFY" : \ 159 (r)->state == ORM_STATE_SUCCEEDED ? "ORM_STATE_SUCCEEDED" : \ 160 (r)->state == ORM_STATE_FAILED ? "ORM_STATE_FAILED" : \ 161 (r)->state == ORM_STATE_ABORTED ? "ORM_STATE_ABORTED" : \ 181 ORM_STATE_WAIT_ACCESS,
182 ORM_STATE_CHECK_ACCESS,
183 ORM_STATE_HAS_ACCESS,
187 ORM_STATE_WAIT_VERIFY,
188 ORM_STATE_CHECK_VERIFY,
207 E_FsStatus successFlag;
216 typedef struct HttpReplyBuffer_struct
231 P_OrmRequest (*Alloc)(void);
232 void (*Action)(P_OrmRequest request);
233 void (*Clear)(P_OrmRequest request);
251 MHEG5Int responseCode;
258 #ifdef CHECK_ORM_MAGIC 270 U16BIT redirectCount;
273 void *hybrid_mapping;
289 #ifdef COMMON_INTERFACE 292 static BOOLEAN ciMessageSent = FALSE;
293 static U16BIT ciRequestCount = 0;
294 static H_Timer ciAckTimerHandle = NULL;
297 static U32BIT globalRequestId = 0;
300 static BOOLEAN inprocess = FALSE;
301 static BOOLEAN reprocess = FALSE;
304 static BOOLEAN inreset = FALSE;
305 static MHEG5FileOrmResetMode currentResetMode = MHEG5_FILE_ORM_RESET_ALL;
310 static void HybridGetCallback(
void *userData,
S_CONTENT *ocontent );
311 static void HybridGetFailCallback(
void *userData );
312 static BOOLEAN HttpGetCallback(
void *userdata, U32BIT requestId,
314 static BOOLEAN HttpPostCallback(
void *userdata, U32BIT requestId,
323 #define DsmAction DummyFunc 324 #define DsmClear DummyFunc 328 #ifdef COMMON_INTERFACE 329 static BOOLEAN CiSetFileContent(U8BIT *data, U32BIT size,
S_CONTENT *pContent);
333 #define CiAction DummyFunc 334 #define CiClear DummyFunc 340 static P_OrmRequest DvbAlloc(
void);
342 #if defined(CI_PLUS_ONLY) || !defined(COMMON_INTERFACE) || !defined(INCLUDE_IC) 343 static P_OrmRequest AllocNothing(
void);
345 static P_OrmRequest AllocRequest(
void);
347 #if !defined(CI_PLUS_ONLY) || defined(INCLUDE_IC) 361 static void CheckServerAccess(
S_OrmRequest *ormRequest);
362 static void CheckTlsCertificates(
S_OrmRequest *ormRequest);
363 static void PerformHttpRequest(
S_OrmRequest *ormRequest);
364 static void VerifyRequestContent(
S_OrmRequest *ormRequest);
369 static void TlsCertCallback(
void);
370 static void ServerAccessCallback(
void);
371 static void VerificationCallback(
void);
373 static void AppendData(HttpReplyBuffer *hcontent, U8BIT *data, U32BIT dataLen);
377 #define HybrAction DummyFunc 378 #define HybrClear DummyFunc 379 #define HttpAction DummyFunc 380 #define HttpClear DummyFunc 384 static MHEG5Bool DefaultGetProcess(
S_OrmRequest *ormRequest);
386 static void ReprocessRequestList(
void);
387 static void ProcessRequestList(
void);
389 #if defined(CI_PLUS_ONLY) || !defined(COMMON_INTERFACE) || !defined(INCLUDE_IC) 395 static S_OrmFuncs ormFunctions[ORIGIN_MAX] = {
396 { DsmAlloc, DsmAction, DsmClear },
397 { CiAlloc, CiAction, CiClear },
398 { HybrAlloc, HybrAction, HybrClear },
399 { HttpAlloc, HttpAction, HttpClear },
400 { HttpAlloc, HttpAction, HttpClear },
401 { DvbAlloc, DvbAction, DvbClear },
402 { DvbAlloc, DvbAction, DvbClear },
407 #if defined(CI_PLUS_ONLY) || !defined(COMMON_INTERFACE) || !defined(INCLUDE_IC) 408 static P_OrmRequest AllocNothing(
void)
414 static P_OrmRequest AllocRequest(
void)
416 P_OrmRequest request;
421 SET_ORM_MAGIC(request);
426 static P_OrmRequest DvbAlloc(
void)
431 SET_ORM_MAGIC(request);
440 static void DefaultDataClear(
void *data )
448 #ifdef COMMON_INTERFACE 457 contextToAdd->next = ciMessageListHead;
458 ciMessageListHead = contextToAdd;
460 DEBUG_PRINT((
"Added message context to head of ciMessageListHead list\n"));
469 static void RemoveFromCiMessageContextList(
CiMessageContext *contextToRemove)
471 if (contextToRemove == ciMessageListHead)
476 ciMessageListHead = ciMessageListHead->next;
478 INFO_PRINT((
"Removed message context from head of ciMessageListHead list\n"));
485 context = ciMessageListHead;
487 while (context->next)
489 if (context->next == contextToRemove)
494 context->next = contextToRemove->next;
495 INFO_PRINT((
"Removed message context from middle or end of ciMessageListHead list\n"));
498 context = context->next;
502 ERROR_PRINT((
"INTERNAL ERROR: RemoveFromCiMessageContextList - context not found\n"));
517 pRequest = &requestListHead;
518 while (*pRequest != NULL)
520 pRequest = &(*pRequest)->next;
531 static void RemoveFromRequestList(
S_OrmRequest *request)
535 assert(request != NULL);
537 pRequest = &requestListHead;
538 while (*pRequest != NULL && *pRequest != request)
540 pRequest = &(*pRequest)->next;
543 if (*pRequest == request)
545 *pRequest = request->next;
550 ERROR_PRINT((
"INTERNAL ERROR: RemoveFromRequestList - request not found\n"));
555 #ifdef COMMON_INTERFACE 556 static void ciAckTimeoutFunc( BOOLEAN trig,
void *cRef, H_Timer timer )
560 TRACE(TERROR, (
"CAM never returned an ACK! ciRequestCount=%d", ciRequestCount))
561 if (ciRequestCount != 0)
564 ciMessageSent = FALSE;
598 MHEG5Bool requestDone;
602 currentResetMode = resetMode;
604 ormRequest = requestListHead;
607 if (resetMode == MHEG5_FILE_ORM_RESET_ALL)
611 else if (ormRequest->type == ORM_TYPE_GET)
613 if (ormRequest->r.get.priority & FRP_SERVER)
618 else if ((resetMode == MHEG5_FILE_ORM_RESET_SCENE_OBJECTS) &&
619 (ormRequest->r.get.priority & FRP_IN_APP))
642 ormRequest->state = ORM_STATE_FAILED;
645 (ormRequest->type == ORM_TYPE_POST)? PostProcess(ormRequest) :
647 DefaultGetProcess(ormRequest);
653 ormFunctions[ormRequest->origin].Clear(ormRequest);
657 ormRequest = requestListHead;
661 ormRequest = ormRequest->next;
665 #ifdef COMMON_INTERFACE 667 while (ciMessageListHead)
672 ciItem = ciMessageListHead;
675 RemoveFromCiMessageContextList(ciItem);
679 if (ciItem->output.data != NULL)
681 MHEG5CiAckData(ciItem->output.data);
683 MHEG5freeMem(ciItem);
686 if (ciRequestCount != 0)
688 if (ciAckTimerHandle != NULL)
691 ciAckTimerHandle = NULL;
693 (void)
VT_TimerCreate( CI_ACK_TIMEOUT, (F_TimerCallback)ciAckTimeoutFunc, 0, &ciAckTimerHandle );
716 if (resetMode != NULL)
718 *resetMode = currentResetMode;
725 #if defined(PRINT_DSM_FILES) || defined(SAVING_DSM_FILES) 727 #define PRNT_FL_MAX 37 728 typedef struct sFileNames
730 struct sFileNames *next;
735 typedef struct sPrintFiles
737 struct sPrintFiles *next;
739 FileNames_t *file_head;
742 PrintFiles_t print_files_hash[PRNT_FL_MAX];
744 int file_printing = 1;
746 void dumpDsmFile( U8BIT *fname, U8BIT *data, U32BIT size )
748 const char digits[16] =
"0123456789ABCDEF";
761 dvbLocator.original_network_id = multiplexRef.original_network_id;
762 dvbLocator.transport_stream_id = multiplexRef.transport_stream_id;
763 dvbLocator.service_id = (U16BIT)multiplexRef.service_id;
767 nlen = strlen(fname);
768 if (print_files == 0)
771 memset( print_files_hash, 0, 37 *
sizeof(PrintFiles_t));
773 p_pf = &print_files_hash[service_ndx % PRNT_FL_MAX];
775 while ((p_pf->next) && (p_pf->srv_ndx != service_ndx))
778 if (p_pf->srv_ndx != service_ndx)
780 p_pf->srv_ndx = service_ndx;
782 p_fn = p_pf->file_head;
785 if ((nlen == p_fn->nmlen) &&
786 (memcmp( p_fn->name, fname, nlen ) == 0))
795 p_fn = p_pf->file_head;
796 p_pf->file_head = (FileNames_t *)
STB_MemAlloc(
sizeof(FileNames_t) + nlen - 2);
797 p_pf->file_head->next = p_fn;
798 p_pf->file_head->nmlen = nlen;
799 memcpy( p_pf->file_head->name, fname, nlen );
801 #ifdef SAVING_DSM_FILES 802 DBG_SaveFile(service_ndx, dvbLocator.service_id, DSMCC_CurrentCarouselId(
MHEG5_DsmccInstance()), (
char *)fname, data, size);
804 #ifdef PRINT_DSM_FILES 805 DBG_FilePrintf(
"%ld_%d/%s", (
long int)service_ndx, dvbLocator.service_id, (
char *)fname );
806 for (nlen = 0; nlen != size; nlen++)
808 if ((nlen & 0x1f) == 0x00)
809 DBG_FilePrintf(
"\n");
810 DBG_FilePrintf(
"%c%c", digits[data[nlen] >> 4], digits[data[nlen] & 0xf]);
812 DBG_FilePrintf(
"\n*\n");
818 #define PRINTFILE(t, n, d, s) dumpDsmFile(n, d, s) 820 #define PRINTFILE(t, n, d, s) 832 #ifdef COMMON_INTERFACE 840 ProcessRequestList();
842 #ifdef COMMON_INTERFACE 843 ciItem = ciMessageListHead;
844 while (ciItem != NULL)
846 switch (ciItem->successFlag)
850 RemoveFromCiMessageContextList(ciItem);
853 output.data = &ciItem->output.data[1];
854 output.len = ciItem->output.len - 1;
855 (ciItem->callback)(ciItem->userData, output, MHEG5TRUE);
857 if (ciItem->output.data != NULL)
859 MHEG5CiAckData(ciItem->output.data);
861 MHEG5freeMem(ciItem);
868 ciItem = ciMessageListHead;
871 case FS_STATUS_INVALID:
873 if (ciRequestCount < MAX_CI_REQUESTS && !ciMessageSent)
876 if (ciItem->input.data != NULL &&
877 STB_CIFileRequest(MHEG5GetCiModuleId(), ciItem->input.data, ciItem->input.len) == TRUE)
880 ciItem->successFlag = FS_STATUS_PENDING;
882 ciMessageSent = TRUE;
888 ciItem = ciItem->next;
892 ERROR_PRINT((
"MHEG5FileOrmProcess : error from ciFileRequest\n"));
895 (ciItem->callback)(ciItem->userData, ciItem->output, MHEG5FALSE);
898 RemoveFromCiMessageContextList(ciItem);
900 MHEG5freeMem(ciItem);
903 ciItem = ciMessageListHead;
907 case FS_STATUS_PENDING:
908 ciItem = ciItem->next;
936 *origin = ORIGIN_ERROR;
939 if ((name.len > 6) && (MHEG5strncmp(name.data,
"dvb://", 6) == 0))
941 *origin = ORIGIN_DVB;
943 else if ((name.len > 6) && (MHEG5strncmp(name.data,
"rec://", 6) == 0))
945 *origin = ORIGIN_REC;
948 if ((*origin == ORIGIN_DVB) || (*origin == ORIGIN_REC))
962 WARNING_PRINT((
"buildName illegal name \"%s\"\n", name.data));
963 *origin = ORIGIN_ERROR;
967 DEBUG_PRINT((
"buildName [%.*s] %s, %d\n", name.len, name.data, data, *origin));
984 ormRequest = requestListHead;
986 while (ormRequest != NULL)
989 next = ormRequest->next;
992 if (ormRequest == orm_ref && ormRequest->type == ORM_TYPE_GET)
995 RemoveFromRequestList(ormRequest);
998 ormRequest->state = ORM_STATE_ABORTED;
999 ormFunctions[ormRequest->origin].Clear(ormRequest);
1001 next = requestListHead;
1013 static MHEG5Bool MHEG5FileOrmIsWaiting(
void *usr,
MHEG5String url)
1019 ormRequest = requestListHead;
1024 next = ormRequest->next;
1027 check = ormRequest->type == ORM_TYPE_GET && ormRequest->userData == usr;
1034 check = check && !(ormRequest->r.get.priority & FRP_HASH);
1039 if (ormRequest->url.len == url.len &&
1040 strcmp((
char *)ormRequest->url.data, (
char *)url.data) == 0)
1049 RemoveFromRequestList(ormRequest);
1052 ormFunctions[ormRequest->origin].Clear(ormRequest);
1061 #ifdef INCLUDE_DSM_FG 1062 static void FileGroupComplete( E_FsStatus status,
S_CONTENT *content )
1066 requestId = (U32BIT)content->user_data;
1067 ormRequest = requestListHead;
1068 while (ormRequest != NULL)
1070 if (ormRequest->requestId == requestId)
1075 TRACE(TFILE, (
" Got size=%d, for:%s", content->size, ormRequest->url.data));
1076 ormRequest->state = ORM_STATE_SUCCEEDED;
1080 case FS_STATUS_INVALID:
1081 ormRequest->state = ORM_STATE_QUEUED;
1084 case FS_STATUS_ERROR:
1085 TRACE(TFILE, (
" Failed to get %s", ormRequest->url.data));
1086 ormRequest->state = ORM_STATE_FAILED;
1089 case FS_STATUS_ABORT:
1090 TRACE(TFILE, (
" ABORTED %s", ormRequest->url.data));
1091 if (ormRequest->state == ORM_STATE_REQUESTED)
1093 ormRequest->state = ORM_STATE_FAILED;
1098 case FS_STATUS_PENDING:
1099 TRACE(TERROR, (
" STILL PENDING! %s", ormRequest->url.data))
1100 ormRequest->state = ORM_STATE_REQUESTED;
1105 TRACE(TERROR, (
"UNKNOWN return %d for %s", status, ormRequest->url.data))
1106 ormRequest->state = ORM_STATE_FAILED;
1111 ormRequest = ormRequest->next;
1115 static MHEG5Bool FileGroupAction( E_FS_ORIGIN origin, U8BIT *path, P_OrmRequest ormRequest, U16BIT priority )
1120 if (priority & FRP_EXISTS)
1126 status =
FG_LoadRequest( origin, (
char *)path, FileGroupComplete,
1127 &ormRequest->r.get.ocontent, (U8BIT)(priority & FRP_CACHE_MASK) );
1133 ormRequest->state = ORM_STATE_SUCCEEDED;
1134 ReprocessRequestList();
1138 case FS_STATUS_PENDING:
1140 TRACE(TFILE, (
" loading %s", ormRequest->url.data));
1141 ormRequest->state = ORM_STATE_REQUESTED;
1142 ReprocessRequestList();
1146 case FS_STATUS_INVALID:
1152 case FS_STATUS_ERROR:
1154 TRACE(TFILE, (
"(%s) stat %d", ormRequest->url.data, status));
1155 ormRequest->state = ORM_STATE_FAILED;
1156 ReprocessRequestList();
1180 F_CB_Good cbGood, F_CB_Fail cbFail)
1183 #if defined(INCLUDE_DSM_FG) || defined(TRACING) 1186 E_FS_ORIGIN origin = DEFAULT_ORIGIN;
1187 P_OrmRequest ormRequest;
1188 MHEG5Bool requestDone;
1190 assert( cbGood != NULL );
1191 assert( cbFail != NULL );
1203 #if defined(INCLUDE_DSM_FG) || defined(TRACING) 1206 buildName(name, &url, &origin);
1207 if (origin == ORIGIN_ERROR)
1215 else if ((userData != NULL) && (MHEG5FileOrmIsWaiting(userData, url)))
1217 TRACE(TFILE, (
"repeated request (%p) for file %s", userData, url.data));
1224 ormRequest = ormFunctions[origin].Alloc();
1225 if (ormRequest == NULL)
1227 TRACE(TERROR, (
"memory failure, or origin not supported; url=%s", path))
1235 ormRequest->url = url;
1236 ormRequest->origin = origin;
1237 ormRequest->userData = userData;
1238 ormRequest->r.get.cbGood = cbGood;
1239 ormRequest->r.get.cbFail = cbFail;
1240 ormRequest->requestId = ++globalRequestId;
1241 ud.u32 = globalRequestId;
1242 ormRequest->r.get.ocontent.user_data = ud.ptr;
1243 if (origin == ORIGIN_HTTP || origin == ORIGIN_HTTPS)
1245 priority |= FRP_VERIFY;
1247 ormRequest->r.get.priority = priority;
1248 TRACE(TFILE, (
"Ptr=%p url=%s priority=0x%x", ormRequest, path, priority))
1251 AddToRequestList(ormRequest);
1252 #ifdef INCLUDE_DSM_FG 1253 if (!FileGroupAction(origin,path,ormRequest,priority))
1256 ormFunctions[origin].Action(ormRequest);
1258 VERIFY_ORM_MAGIC(ormRequest);
1259 if (ormRequest->state == ORM_STATE_SUCCEEDED ||
1260 ormRequest->state == ORM_STATE_FAILED)
1262 requestDone = DefaultGetProcess(ormRequest);
1265 ormFunctions[origin].Clear(ormRequest);
1291 U16BIT priority,
void *userData, F_CB_Good cbGood, F_CB_Fail cbFail)
1294 P_OrmRequest ormRequest;
1295 MHEG5Bool requestDone;
1297 assert( cbGood != NULL );
1298 assert( cbFail != NULL );
1299 assert( name.zlen );
1301 if (origin == ORIGIN_ERROR)
1310 if (url.data == NULL)
1317 ormRequest = ormFunctions[origin].Alloc();
1318 if (ormRequest == NULL)
1320 TRACE(TERROR, (
"memory failure, or origin not supported; url=%s", url.data))
1328 ormRequest->url = url;
1329 ormRequest->origin = origin;
1330 ormRequest->type = ORM_TYPE_FGR;
1331 ormRequest->userData = userData;
1332 ormRequest->r.get.cbGood = cbGood;
1333 ormRequest->r.get.cbFail = cbFail;
1334 ormRequest->requestId = ++globalRequestId;
1335 ud.u32 = globalRequestId;
1336 ormRequest->r.get.ocontent.user_data = ud.ptr;
1337 if (origin == ORIGIN_HTTP || origin == ORIGIN_HTTPS)
1339 priority |= FRP_VERIFY;
1341 ormRequest->r.get.priority = priority;
1342 TRACE(TFILE, (
"Ptr=%p url=%s", ormRequest, url.data))
1345 AddToRequestList(ormRequest);
1346 ormFunctions[origin].Action(ormRequest);
1347 VERIFY_ORM_MAGIC(ormRequest);
1348 if (ormRequest->state == ORM_STATE_SUCCEEDED ||
1349 ormRequest->state == ORM_STATE_FAILED)
1351 requestDone = DefaultGetProcess(ormRequest);
1354 ormFunctions[origin].Clear(ormRequest);
1364 #ifdef COMMON_INTERFACE 1375 MHEG5Bool MHEG5FileOrmSendCiMessage(
MHEG5String input, F_CB_CiMsg callback,
void *userData)
1380 MHEG5Bool err = MHEG5TRUE;
1382 DEBUG_PRINT((
"INFO: MHEG5FileOrmSendCiMessage ( %.*s, 0x%x )\n", input.len, input.data));
1388 ERROR_PRINT((
"ERROR: MHEG5FileOrmSendCiMessage unable to allocate memory\n"));
1395 w->userData = userData;
1396 w->successFlag = FS_STATUS_INVALID;
1397 w->callback = callback;
1398 w->output.data = NULL;
1402 data = (U8BIT *) STR_DataAlloc( input.len + 1 );
1407 memcpy(&data[1], input.data, input.len);
1410 AddToCiMessageContextList(w);
1412 if (ciRequestCount < MAX_CI_REQUESTS && !ciMessageSent)
1415 retval = STB_CIFileRequest(MHEG5GetCiModuleId(), data, input.len + 1);
1419 w->successFlag = FS_STATUS_PENDING;
1421 ciMessageSent = TRUE;
1424 STR_DataFree(data, input.len + 1);
1429 ERROR_PRINT((
"ERROR: MHEG5FileOrmSendCiMessage ciFileRequest retval is %d\n", retval));
1432 RemoveFromCiMessageContextList(w);
1433 STR_DataFree(data, input.len + 1);
1441 w->input.data = data;
1442 w->input.len = input.len + 1;
1448 ERROR_PRINT((
"ERROR: MHEG5FileOrmSendCiMessage unable to allocate memory\n"));
1473 F_CB_Post callback,
void *userData)
1477 E_FS_ORIGIN origin = ORIGIN_HYBRID;
1479 MHEG5Bool success = MHEG5FALSE;
1480 MHEG5Bool requestDone;
1486 callback(userData, invalid, 0);
1491 buildName(name, &url, &origin);
1492 if (origin == ORIGIN_ERROR)
1495 callback(userData, invalid, 0);
1500 ormRequest = ormFunctions[origin].Alloc();
1501 if (ormRequest == NULL)
1503 TRACE(TERROR, (
"memory failure, or origin not supported; url=%s", url.data))
1504 callback(userData, invalid, 0);
1509 ormRequest->url = url;
1510 ormRequest->origin = origin;
1511 ormRequest->userData = userData;
1512 ormRequest->type = ORM_TYPE_POST;
1513 ormRequest->requestId = ++globalRequestId;
1515 ormRequest->r.post.callback = callback;
1517 AddToRequestList(ormRequest);
1518 ormFunctions[origin].Action(ormRequest);
1519 if (ormRequest->state == ORM_STATE_FAILED)
1521 TRACE(TFILE, (
"Ptr=%p url=%s", ormRequest, url.data))
1523 requestDone = PostProcess(ormRequest);
1526 ormFunctions[origin].Clear(ormRequest);
1529 else if (ormRequest->state == ORM_STATE_REQUESTED)
1531 TRACE(TFILE,(
"url = \"%s\"", (
char *)url.data));
1532 success = MHEG5TRUE;
1537 ERROR_PRINT((
"MHEG5FileOrmReturnData : Unexpected result\n"));
1557 E_FS_ORIGIN origin = DEFAULT_ORIGIN;
1558 #ifndef CI_PLUS_ONLY 1570 #ifndef CI_PLUS_ONLY 1571 buffer = buildName(name, &url, &origin);
1572 if (origin == ORIGIN_DSM)
1578 buildName(name, &url, &origin);
1584 #ifndef CI_PLUS_ONLY 1595 ud.ptr = param->content.user_data;
1596 ormRequest = FindRequest(ud.u32);
1597 if (ormRequest != NULL)
1599 assert(ormRequest->origin == ORIGIN_DSM);
1600 switch (param->status)
1603 TRACE(TFILE, (
" Got size=%d, for:%s", param->content.size, ormRequest->url.data));
1604 ormRequest->state = ORM_STATE_SUCCEEDED;
1605 ormRequest->r.get.ocontent = param->content;
1608 case FS_STATUS_INVALID:
1609 ormRequest->state = ORM_STATE_QUEUED;
1612 case FS_STATUS_ERROR:
1613 TRACE(TFILE, (
" Failed to get %s", ormRequest->url.data));
1614 ormRequest->state = ORM_STATE_FAILED;
1617 case FS_STATUS_ABORT:
1618 TRACE(TFILE, (
" ABORTED %s", ormRequest->url.data));
1619 if (ormRequest->state == ORM_STATE_REQUESTED)
1621 ormRequest->state = ORM_STATE_FAILED;
1626 case FS_STATUS_PENDING:
1627 TRACE(TERROR, (
" STILL PENDING! %s", ormRequest->url.data))
1628 ormRequest->state = ORM_STATE_REQUESTED;
1633 TRACE(TERROR, (
"UNKNOWN return %d for %s", param->status, ormRequest->url.data))
1634 ormRequest->state = ORM_STATE_FAILED;
1640 static void FileOrmDsmccComplete( E_FsStatus status,
S_CONTENT *content )
1645 ormRequest = FindRequest((U32BIT)content->user_data);
1646 if (ormRequest != NULL)
1648 TRACE(TFILE, (
"ptr=%p url:%s size=%u", ormRequest, ormRequest->url.data, content->size ));
1652 TRACE(TFILE, (
"rid=%u size=%u",(U32BIT)content->user_data, content->size));
1655 msg.data.fsAck.content = *content;
1656 msg.data.fsAck.status = status;
1658 msg.data_type = DT_CONTENT;
1663 #ifdef COMMON_INTERFACE 1673 #ifdef COMMON_INTERFACE 1676 U8BIT fileNameLength;
1680 DEBUG_PRINT((
"MHEG5ciFileAcknowledge(%s, [%x %x], %d) ciRequestCount=%d\n",
1681 fileOK ?
"TRUE" :
"FALSE", pFileData[0], pFileData[1], length, ciRequestCount));
1685 if (pFileData != NULL && length > 0 && ciRequestCount > 0)
1688 if (ciAckTimerHandle != NULL)
1691 ciAckTimerHandle = NULL;
1693 if (pFileData[0] == 0x00 && length > 1)
1695 fileNameLength = pFileData[1];
1697 DEBUG_PRINT((
"MHEG5ciFileAcknowledge: URL=%s\n", pFileData + 2));
1700 ormRequest = requestListHead;
1701 while (ormRequest != NULL)
1703 if (ormRequest->origin == ORIGIN_CI)
1705 url = (
char *)ormRequest->url.data;
1706 if ((ormRequest->url.len == fileNameLength) &&
1707 (strncmp(url, (
char *)pFileData + 2, fileNameLength) == 0))
1710 if (fileOK && CiSetFileContent(pFileData,length,&ormRequest->r.get.ocontent))
1712 ormRequest->state = ORM_STATE_SUCCEEDED;
1718 ormRequest->state = ORM_STATE_FAILED;
1719 if (ormRequest->type == ORM_TYPE_GET)
1721 ormRequest->r.get.ocontent.size = 0;
1722 ormRequest->r.get.ocontent.data = NULL;
1728 ormRequest = ormRequest->next;
1731 else if (pFileData[0] == 0x01)
1734 ciMessageSent = FALSE;
1737 ciItem = ciMessageListHead;
1738 while (ciItem != NULL)
1740 if (ciItem->successFlag == FS_STATUS_PENDING)
1743 ciItem->successFlag = FS_STATUS_OK;
1744 ciItem->output.len = length;
1745 ciItem->output.data = pFileData;
1751 ciItem = ciItem->next;
1756 if (ack && pFileData != NULL)
1759 MHEG5CiAckData(pFileData);
1777 static void HybridGetCallback(
void *userData,
S_CONTENT *ocontent )
1783 VERIFY_ORM_MAGIC(ormRequest);
1784 assert(ormRequest->type == ORM_TYPE_GET);
1785 ormRequest->r.get.ocontent = *ocontent;
1787 ocontent->destroy = NULL;
1788 ormRequest->r.get.child = NULL;
1790 ormRequest->state = ORM_STATE_SUCCEEDED;
1791 ReprocessRequestList();
1801 static void HybridGetFailCallback(
void *userData )
1807 VERIFY_ORM_MAGIC(ormRequest);
1809 assert(ormRequest->origin == ORIGIN_HYBRID);
1810 ormRequest->state = ORM_STATE_QUEUED;
1811 if (ormRequest->type != ORM_TYPE_POST)
1813 ormRequest->r.get.child = NULL;
1816 ReprocessRequestList();
1830 static void httpRequestAck(U32BIT requestId, U32BIT status, S32BIT code,
1831 U8BIT *data, U32BIT len)
1835 BOOLEAN releaseData;
1840 ormRequest = FindRequest(requestId);
1841 if (ormRequest != NULL && (IS_HTTP_REQUEST(ormRequest)))
1843 if (status == HTTP_STATUS_OK)
1845 TRACE(TFILE, (
"code=%d", code))
1846 if (((code >= 301) && (code <= 305)) || (code == 307))
1848 if (ormRequest->type != ORM_TYPE_POST)
1851 HttpRedirect(ormRequest);
1856 ormRequest->state = ORM_STATE_FAILED;
1857 TRACE(TFILE, (
"POST redirect Ptr=%p FAIL url=%s", ormRequest, ormRequest->url.data))
1860 else if (code != 200)
1862 if (code >= 400 && code < 500)
1864 if (ormRequest->type == ORM_TYPE_POST ||
1865 !(ormRequest->r.get.priority & (FRP_HASH | FRP_CERT)))
1870 ormRequest->state = ORM_STATE_FAILED;
1871 TRACE(TFILE, (
"Ptr=%p FAIL url=%s", ormRequest, ormRequest->url.data))
1876 if (ormRequest->type != ORM_TYPE_POST)
1878 if (ormRequest->r.get.ocontent.data != NULL)
1880 MHEG5freeMem(ormRequest->r.get.ocontent.data);
1883 ormRequest->r.get.ocontent.data = data;
1884 ormRequest->r.get.ocontent.size = len;
1885 ormRequest->r.get.ocontent.destroy = DefaultDataClear;
1886 ormRequest->r.get.ocontent.fs_handle = data;
1887 releaseData = FALSE;
1891 VerifyRequestContent(ormRequest);
1894 else if (status == HTTP_STATUS_SSL_ERROR)
1897 ormRequest->state = ORM_STATE_QUEUED;
1898 ReprocessRequestList();
1900 else if (status == HTTP_STATUS_NETWORK_ERROR)
1902 if (ormRequest->type == ORM_TYPE_POST ||
1903 !(ormRequest->r.get.priority & FRP_HASH))
1907 TRACE(TFILE, (
"Network error Ptr=%p FAIL url=%s", ormRequest, ormRequest->url.data))
1908 ormRequest->state = ORM_STATE_FAILED;
1910 else if (status == HTTP_STATUS_TIMEOUT)
1913 TRACE(TFILE, (
"response mod Ptr=%p FAIL url=%s", ormRequest, ormRequest->url.data))
1915 ormRequest->state = ORM_STATE_FAILED;
1919 TRACE(TFILE, (
"status=%d Ptr=%p FAIL url=%s", status, ormRequest, ormRequest->url.data))
1920 ormRequest->state = ORM_STATE_FAILED;
1923 if (ormRequest->type == ORM_TYPE_POST)
1926 ormRequest->r.post.responseData.data = data;
1927 ormRequest->r.post.responseData.len = len;
1928 ormRequest->r.post.responseCode = code;
1929 releaseData = FALSE;
1933 fileRef = ormRequest->requestRef;
1934 ormRequest->requestRef = NULL;
1940 TRACE(TERROR, (
"Cannot find request (requestId = %d)\n", requestId));
1943 if (releaseData && data != NULL)
1955 static void httpResponse(MHEG5HttpResponseEventParams_t *params)
1957 httpRequestAck(params->requestId, params->status, params->code,
1958 params->data, params->len);
1969 static BOOLEAN HttpGetCallback(
void *userdata, U32BIT requestId,
1972 HttpReplyBuffer *hcontent = userdata;
1976 if (response->data_len > 0)
1978 AppendData(hcontent, response->data, response->data_len);
1981 if (response->status != HTTP_STATUS_WAIT)
1984 event.data_type = DT_ALLOC;
1985 event.data.httpResponse.requestId = requestId;
1986 event.data.httpResponse.status = response->status;
1987 event.data.httpResponse.code = response->code;
1988 event.data.httpResponse.data = hcontent->data;
1989 event.data.httpResponse.len = hcontent->used;
1991 cqu_err =
VQ_PutMsg(&event, PRTY_NORMAL);
1992 if (cqu_err != MHERR_OK)
1994 TRACE(TERROR, (
"VQ_PutMsg failed", cqu_err));
1995 MHEG5freeMem(hcontent->data);
1998 MHEG5freeMem(hcontent);
2011 static BOOLEAN HttpPostCallback(
void *userdata, U32BIT requestId,
2014 HttpReplyBuffer *hcontent = userdata;
2018 if (response->data_len > 0)
2020 AppendData(hcontent, response->data, response->data_len);
2023 if (response->status != HTTP_STATUS_WAIT)
2026 event.data_type = DT_ALLOC;
2027 event.data.httpResponse.requestId = requestId;
2028 event.data.httpResponse.status = response->status;
2029 event.data.httpResponse.code = response->code;
2030 event.data.httpResponse.data = hcontent->data;
2031 event.data.httpResponse.len = hcontent->used;
2033 cqu_err =
VQ_PutMsg(&event, PRTY_NORMAL);
2034 if (cqu_err != MHERR_OK)
2036 TRACE(TERROR, (
"VQ_PutMsg failed", cqu_err));
2037 MHEG5freeMem(hcontent->data);
2040 MHEG5freeMem(hcontent);
2049 #ifndef CI_PLUS_ONLY 2061 assert(ormRequest->origin == ORIGIN_DSM);
2065 TRACE(TFILE,(
"Fetching url: %s", (
char *)ormRequest->url.data));
2067 flags = ormRequest->r.get.priority & FRP_CACHE_MASK;
2068 if (ormRequest->r.get.priority & FRP_EXISTS)
2070 flags |= LOAD_FLAGS_REQUEST_EXISTANCE_BIT;
2072 if (ormRequest->r.get.priority & FRP_DEFER_SERV)
2074 flags |= LOAD_FLAGS_REQUEST_DEFERRED_SERVICE_BIT;
2076 if (ormRequest->r.get.priority & FRP_GROUP)
2078 flags |= LOAD_FLAGS_REQUEST_FILE_ONLY_BIT;
2081 FileOrmDsmccComplete, &ormRequest->r.get.ocontent );
2082 TRACE(TFILE, (
"ref=%p Ptr=%p", ormRequest->requestRef, ormRequest))
2083 TRACE(TFILE, (
"url=%s, rtn=%d", ormRequest->url.data, retval))
2087 assert(ormRequest->requestRef == NULL);
2088 ormRequest->state = ORM_STATE_SUCCEEDED;
2089 ReprocessRequestList();
2092 case FS_STATUS_PENDING:
2093 TRACE(TFILE, (
" loading %s", ormRequest->url.data));
2094 ormRequest->state = ORM_STATE_REQUESTED;
2095 ReprocessRequestList();
2098 case FS_STATUS_INVALID:
2100 ormRequest->state = ORM_STATE_QUEUED;
2105 TRACE(TFILE, (
"dsmFLoad(%s) retval is %d\n", ormRequest->url.data, retval));
2106 ormRequest->state = ORM_STATE_FAILED;
2107 ReprocessRequestList();
2113 #ifndef CI_PLUS_ONLY 2121 VERIFY_ORM_MAGIC(ormRequest);
2122 assert(ormRequest->origin == ORIGIN_DSM);
2124 TRACE(TFILE, (
"Ptr=%p url(%d)=%s", ormRequest,ormRequest->url.len,ormRequest->url.data))
2126 if (ormRequest->r.get.ocontent.destroy != NULL)
2129 ormRequest->r.get.ocontent.destroy( ormRequest->r.get.ocontent.fs_handle );
2133 CLEAR_ORM_MAGIC(ormRequest);
2134 MHEG5freeMem(ormRequest);
2148 assert(ormRequest->origin == ORIGIN_DVB || ormRequest->origin == ORIGIN_REC);
2151 success =
MHEG5parseUrl(ormRequest->url.data, ormRequest->url.len,
2152 &dvbMultiplexReference );
2155 ormRequest->r.get.ocontent.data = (U8BIT *)&dvbMultiplexReference;
2159 assert( ormRequest->r.get.ocontent.destroy == NULL );
2160 assert( ormRequest->r.get.ocontent.fs_handle == NULL );
2162 ormRequest->state = ORM_STATE_SUCCEEDED;
2166 ormRequest->state = ORM_STATE_FAILED;
2168 ReprocessRequestList();
2178 VERIFY_ORM_MAGIC(ormRequest);
2180 assert(ormRequest->type == ORM_TYPE_GET);
2197 assert(ormRequest->origin == ORIGIN_HYBRID);
2198 assert(ormRequest->state == ORM_STATE_START);
2200 TRACE(TFILE,(
"Fetching url: %s", (
char *)ormRequest->url.data));
2202 reference.len = ormRequest->url.len - 7;
2203 reference.data = ormRequest->url.data + 7;
2205 if (ormRequest->hybrid_mapping == NULL)
2213 if (mapped.len != 0)
2215 ormRequest->state = ORM_STATE_REQUESTED;
2216 if (ormRequest->type == ORM_TYPE_FGR)
2221 path.zlen = mapped.len - offset;
2222 path.zptr = mapped.data + offset;
2225 ormRequest->r.get.child =
MHEG5FileOrmRetrieve( origin, path, name, ormRequest->r.get.priority,
2226 ormRequest, HybridGetCallback, HybridGetFailCallback );
2231 ormRequest->r.get.child =
MHEG5FileOrmGet( mapped, ormRequest->r.get.priority, ormRequest,
2232 HybridGetCallback, HybridGetFailCallback );
2239 ormRequest->hybrid_mapping = NULL;
2240 ormRequest->state = ORM_STATE_FAILED;
2241 ReprocessRequestList();
2246 }
while (ormRequest->state == ORM_STATE_QUEUED);
2256 VERIFY_ORM_MAGIC(ormRequest);
2257 assert(ormRequest->origin == ORIGIN_HYBRID);
2259 if (ormRequest->r.get.ocontent.destroy != NULL)
2262 ormRequest->r.get.ocontent.destroy( ormRequest->r.get.ocontent.fs_handle );
2264 TRACE(TFILE,(
"ptr=%p url=\"%s\"",ormRequest,(
char *)ormRequest->url.data));
2265 if (ormRequest->r.get.child != NULL)
2269 VERIFY_ORM_MAGIC(childRequest);
2270 assert(childRequest->userData == ormRequest);
2273 RemoveFromRequestList(childRequest);
2274 childRequest->state = ORM_STATE_ABORTED;
2275 ormFunctions[childRequest->origin].Clear(childRequest);
2278 if (ormRequest->hybrid_mapping != NULL)
2281 ormRequest->hybrid_mapping = NULL;
2285 CLEAR_ORM_MAGIC(ormRequest);
2286 MHEG5freeMem(ormRequest);
2296 static MHEG5Bool DefaultGetProcess(
S_OrmRequest *ormRequest)
2298 MHEG5Bool requestDone;
2300 requestDone = MHEG5FALSE;
2302 if (ormRequest->state == ORM_STATE_SUCCEEDED)
2305 if (MH5GlueActiveState() || !(ormRequest->r.get.priority & FRP_GROUP))
2308 RemoveFromRequestList(ormRequest);
2310 TRACE(TFILE, (
"Ptr=%p GOT IT url=%s", ormRequest, ormRequest->url.data))
2314 PRINTFILE( ormRequest->type, ormRequest->url.data, ormRequest->r.get.ocontent.data, ormRequest->r.get.ocontent.size );
2317 ormRequest->r.get.cbGood( ormRequest->userData, &ormRequest->r.get.ocontent );
2319 requestDone = MHEG5TRUE;
2323 TRACE(TFILE, (
"Delay process of file, url=%s", ormRequest, ormRequest->url.data))
2326 else if (ormRequest->state == ORM_STATE_FAILED)
2329 RemoveFromRequestList(ormRequest);
2331 TRACE(TFILE, (
"Ptr=%p FAIL url=%s", ormRequest, ormRequest->url.data))
2334 if (ormRequest->r.get.cbFail != NULL)
2336 ormRequest->r.get.cbFail( ormRequest->userData );
2338 requestDone = MHEG5TRUE;
2340 else if (ormRequest->state == ORM_STATE_ABORTED)
2343 RemoveFromRequestList(ormRequest);
2345 TRACE(TFILE, (
"Ptr=%p ABORT url=%s", ormRequest, ormRequest->url.data))
2348 requestDone = MHEG5TRUE;
2350 else if (ormRequest->state == ORM_STATE_QUEUED ||
2351 ormRequest->state == ORM_STATE_HAS_ACCESS)
2353 TRACE(TFILE, (
"Ptr=%p QUEUE url=%s", ormRequest, ormRequest->url.data))
2356 ormRequest->state = ORM_STATE_START;
2357 ormFunctions[ormRequest->origin].Action(ormRequest);
2359 else if (ormRequest->state == ORM_STATE_CHECK_VERIFY ||
2360 ormRequest->state == ORM_STATE_CHECK_ACCESS)
2362 TRACE(TFILE, (
"Ptr=%p OK url=%s", ormRequest, ormRequest->url.data))
2365 ormFunctions[ormRequest->origin].Action(ormRequest);
2389 assert(ormRequest->type != ORM_TYPE_POST && IS_HTTP_REQUEST(ormRequest));
2391 ormRequest->state = ORM_STATE_FAILED;
2393 if (ormRequest->redirectCount < MAX_REDIRECTS)
2396 if (redirectUrl != NULL)
2399 name.data = redirectUrl;
2400 name.len = strlen((
char *)redirectUrl);
2401 buildName(name, &url, &origin);
2402 if ((origin == ORIGIN_HTTP) || (origin == ORIGIN_HTTPS))
2405 ormRequest->url = url;
2406 ormRequest->origin = origin;
2408 ++ormRequest->redirectCount;
2409 ormRequest->certCount = 0;
2410 ormRequest->state = ORM_STATE_QUEUED;
2411 ReprocessRequestList();
2428 MHEG5Bool requestDone;
2430 assert(ormRequest->type == ORM_TYPE_POST);
2432 requestDone = MHEG5FALSE;
2433 if (ormRequest->state == ORM_STATE_SUCCEEDED ||
2434 ormRequest->state == ORM_STATE_FAILED)
2437 RemoveFromRequestList(ormRequest);
2439 ormRequest->r.post.callback(ormRequest->userData, ormRequest->r.post.responseData,
2440 ormRequest->r.post.responseCode);
2442 requestDone = MHEG5TRUE;
2444 else if (ormRequest->state == ORM_STATE_CHECK_VERIFY ||
2445 ormRequest->state == ORM_STATE_CHECK_ACCESS)
2448 ormFunctions[ormRequest->origin].Action(ormRequest);
2456 #ifdef COMMON_INTERFACE 2458 static BOOLEAN CiSetFileContent(U8BIT *data, U32BIT size,
S_CONTENT *pContent)
2462 U8BIT fileNameLength;
2469 fileNameLength = data[1];
2470 if (size >= fileNameLength + 6U)
2472 fileData = data + fileNameLength + 2;
2473 fileSize = (fileData[0] << 24 |
2475 fileData[2] << 8 | fileData[3]);
2477 if (size < fileSize + fileNameLength + 6)
2484 if (fileData == NULL)
2489 pContent->data = fileData;
2490 pContent->size = fileSize;
2491 pContent->destroy = (F_DESTROY)MHEG5CiAckData;
2492 pContent->fs_handle = (FS_HANDLE)fileData;
2504 U8BIT ciRequest[MHEG5_ABSOLUTE_PATH_LENGTH + 1];
2508 assert(ormRequest->origin == ORIGIN_CI);
2510 ormRequest->state = ORM_STATE_FAILED;
2511 if (ciRequestCount < MAX_CI_REQUESTS)
2514 length = ormRequest->url.len;
2515 if (length <= MHEG5_ABSOLUTE_PATH_LENGTH)
2517 ciRequest[0] = 0x00;
2518 memcpy(&ciRequest[1], ormRequest->url.data, length);
2520 TRACE(TFILE, (
"Ptr=%p len=%d url=%s", length,ormRequest->url.data))
2523 retval = STB_CIFileRequest(MHEG5GetCiModuleId(), ciRequest, length + 1);
2527 ormRequest->state = ORM_STATE_REQUESTED;
2535 ormRequest->state = ORM_STATE_QUEUED;
2547 VERIFY_ORM_MAGIC(ormRequest);
2548 assert( ormRequest->origin == ORIGIN_CI );
2550 TRACE(TFILE, (
"Ptr=%p url(%d)=%s", ormRequest,ormRequest->url.len,ormRequest->url.data))
2552 if (ormRequest->r.get.ocontent.destroy != NULL)
2555 assert( ormRequest->r.get.ocontent.destroy == (F_DESTROY)MHEG5CiAckData );
2556 ormRequest->r.get.ocontent.destroy( ormRequest->r.get.ocontent.fs_handle );
2560 CLEAR_ORM_MAGIC(ormRequest);
2561 MHEG5freeMem(ormRequest);
2575 static BOOLEAN HttpExistsCallback(
void *userdata, U32BIT requestId,
2581 if (response->status != HTTP_STATUS_WAIT)
2584 event.data_type = DT_VALUE;
2585 event.data.httpResponse.requestId = requestId;
2586 event.data.httpResponse.status = response->status;
2587 event.data.httpResponse.code = response->code;
2588 event.data.httpResponse.data = NULL;
2589 event.data.httpResponse.len = 0;
2591 cqu_err =
VQ_PutMsg(&event, PRTY_NORMAL);
2592 if (cqu_err != MHERR_OK)
2594 TRACE(TERROR, (
"VQ_PutMsg failed", cqu_err));
2608 MHEG5Bool connectionEnabled;
2610 assert(IS_HTTP_REQUEST(ormRequest));
2612 TRACE(TFILE,(
"Fetching / checking url \"%s\"", (
char *)ormRequest->url.data));
2615 MHEG5isConnectionEnabled(&connectionEnabled);
2616 if (connectionEnabled)
2619 TRACE(TFILE,(
"[1] state = %s\n", ORM_STATE_STRING(ormRequest)));
2620 if (ormRequest->state == ORM_STATE_START ||
2621 ormRequest->state == ORM_STATE_CHECK_ACCESS)
2623 CheckServerAccess(ormRequest);
2625 TRACE(TFILE,(
"[2] state = %s\n", ORM_STATE_STRING(ormRequest)));
2626 if (ormRequest->state == ORM_STATE_HAS_ACCESS)
2628 CheckTlsCertificates(ormRequest);
2630 TRACE(TFILE,(
"[3] state = %s\n", ORM_STATE_STRING(ormRequest)));
2631 if (ormRequest->state == ORM_STATE_HAS_CERT)
2633 PerformHttpRequest(ormRequest);
2635 TRACE(TFILE,(
"[4] state = %s\n", ORM_STATE_STRING(ormRequest)));
2636 if (ormRequest->state == ORM_STATE_CHECK_VERIFY)
2638 VerifyRequestContent(ormRequest);
2640 TRACE(TFILE,(
"[5] state = %s\n", ORM_STATE_STRING(ormRequest)));
2641 if (ormRequest->state == ORM_STATE_FAILED)
2643 ReprocessRequestList();
2649 if (ormRequest->type == ORM_TYPE_POST ||
2650 !(ormRequest->r.get.priority & FRP_HASH))
2654 ormRequest->state = ORM_STATE_FAILED;
2655 ReprocessRequestList();
2667 VERIFY_ORM_MAGIC(ormRequest);
2668 assert(IS_HTTP_REQUEST(ormRequest));
2670 TRACE(TFILE, (
"Ptr=%p url(%d)=%s", ormRequest,ormRequest->url.len,ormRequest->url.data))
2672 if (ormRequest->state == ORM_STATE_REQUESTED)
2676 ormRequest->requestRef = NULL;
2679 if (ormRequest->type == ORM_TYPE_GET || ormRequest->type == ORM_TYPE_FGR)
2681 if (ormRequest->r.get.ocontent.destroy != NULL)
2684 ormRequest->r.get.ocontent.destroy(ormRequest->r.get.ocontent.fs_handle );
2687 else if (ormRequest->type == ORM_TYPE_POST)
2689 if (ormRequest->r.post.responseData.data != NULL)
2691 MHEG5freeMem(ormRequest->r.post.responseData.data);
2698 CLEAR_ORM_MAGIC(ormRequest);
2699 MHEG5freeMem(ormRequest);
2708 static void CheckServerAccess(
S_OrmRequest *ormRequest)
2710 MHEG5ServerAccess_t permission;
2715 if (ormRequest->redirectCount > 0)
2720 else if (ormRequest->type != ORM_TYPE_POST)
2722 if (ormRequest->r.get.priority & (FRP_HASH | FRP_CERT))
2732 ormRequest->state = ORM_STATE_WAIT_ACCESS;
2736 case SERVER_ACCESS_PERMITTED_AUTH:
2737 ormRequest->state = ORM_STATE_HAS_ACCESS;
2739 case SERVER_ACCESS_PERMITTED_NO_AUTH:
2740 ormRequest->state = ORM_STATE_HAS_ACCESS;
2741 if (ormRequest->type != ORM_TYPE_POST)
2743 ormRequest->r.get.priority &= ~FRP_VERIFY;
2746 case SERVER_ACCESS_BLOCKED:
2747 ormRequest->state = ORM_STATE_FAILED;
2749 case SERVER_ACCESS_PENDING:
2752 PRINT_ERROR((
"Invalid server access permission\n"));
2758 ormRequest->state = ORM_STATE_HAS_ACCESS;
2772 static void CheckTlsCertificates(
S_OrmRequest *ormRequest)
2775 MHEG5TlsCertRequestStatus status;
2777 if (IS_HTTPS_REQUEST(ormRequest))
2780 ormRequest->state = ORM_STATE_WAIT_CERT;
2783 if (certCount == 0 || ormRequest->certCount == certCount)
2789 if (status == MHEG5_TLS_CERT_REQUEST_SUCCESS)
2793 ormRequest->state = ORM_STATE_HAS_CERT;
2795 else if (status == MHEG5_TLS_CERT_REQUEST_FAILURE)
2797 ormRequest->state = ORM_STATE_FAILED;
2800 else if (ormRequest->certCount < certCount)
2803 ormRequest->certCount = certCount;
2804 ormRequest->state = ORM_STATE_HAS_CERT;
2810 ormRequest->state = ORM_STATE_HAS_CERT;
2819 static void PerformHttpRequest(
S_OrmRequest *ormRequest)
2821 HttpRequest_t httpRequest;
2823 HttpReplyBuffer *hcontent;
2825 U8BIT cachePriority;
2828 if (ormRequest->type != ORM_TYPE_POST)
2830 priority = ormRequest->r.get.priority;
2836 if (!(priority & FRP_EXISTS))
2839 hcontent = MHEG5getMem(
sizeof *hcontent);
2840 if (hcontent != NULL)
2842 hcontent->allocated = 0;
2844 hcontent->data = NULL;
2845 hcontent->valid = TRUE;
2849 ormRequest->state = ORM_STATE_FAILED;
2852 if (ormRequest->state != ORM_STATE_FAILED)
2856 if (priority & FRP_EXISTS)
2860 ormRequest->requestId, NULL);
2862 else if (ormRequest->type != ORM_TYPE_POST)
2864 if ((ormRequest->r.get.priority & (FRP_GROUP | FRP_CACHE_MASK))
2872 cachePriority = ormRequest->r.get.priority & FRP_CACHE_MASK;
2877 ormRequest->requestId, hcontent);
2878 TRACE(TFILE,(
"httpRequest =%p", httpRequest));
2882 postData = ormRequest->r.post.postData.data;
2886 ormRequest->requestId, hcontent);
2889 if (httpRequest != NULL)
2891 ormRequest->requestRef = httpRequest;
2892 ormRequest->state = ORM_STATE_REQUESTED;
2897 MHEG5freeMem(hcontent);
2898 ormRequest->state = ORM_STATE_FAILED;
2908 static void VerifyRequestContent(
S_OrmRequest *ormRequest)
2910 MHEG5ContentVerification_t status;
2912 if ((ormRequest->type == ORM_TYPE_GET || ormRequest->type == ORM_TYPE_FGR) &&
2913 !(ormRequest->r.get.priority & FRP_EXISTS))
2915 if (ormRequest->r.get.priority & FRP_HASH)
2918 ormRequest->state = ORM_STATE_SUCCEEDED;
2920 else if (ormRequest->r.get.priority & (FRP_VERIFY | FRP_GROUP))
2922 TRACE(TFILE,(
"Checking %s\n", ormRequest->url.data));
2924 ormRequest->r.get.ocontent.size );
2927 case CONTENT_NOT_VERIFIED_SAME:
2928 TRACE(TFILE,(
"CONTENT_NOT_VERIFIED_SAME\n"));
2929 ormRequest->state = ORM_STATE_FAILED;
2931 ReprocessRequestList();
2933 case CONTENT_NOT_VERIFIED_NEW:
2934 TRACE(TFILE,(
"CONTENT_NOT_VERIFIED_NEW\n"));
2936 ormRequest->state = ORM_STATE_QUEUED;
2937 ormRequest->certCount = 0;
2939 ReprocessRequestList();
2941 case CONTENT_VERIFIED_SIGNED:
2942 TRACE(TFILE,(
"CONTENT_VERIFIED_SIGNED\n"));
2943 ormRequest->state = ORM_STATE_SUCCEEDED;
2945 ReprocessRequestList();
2947 case CONTENT_VERIFIED_UNSIGNED:
2948 TRACE(TFILE,(
"CONTENT_VERIFIED_UNSIGNED\n"));
2949 if (ormRequest->r.get.priority & FRP_GROUP)
2952 ormRequest->state = ORM_STATE_FAILED;
2957 ormRequest->state = ORM_STATE_SUCCEEDED;
2960 ReprocessRequestList();
2962 case CONTENT_VERIFICATION_PENDING:
2963 TRACE(TFILE,(
"CONTENT_VERIFICATION_PENDING\n"));
2964 ormRequest->state = ORM_STATE_WAIT_VERIFY;
2974 ormRequest->state = ORM_STATE_SUCCEEDED;
2981 ormRequest->state = ORM_STATE_SUCCEEDED;
2990 static void TlsCertCallback(
void)
2994 ormRequest = requestListHead;
2995 while (ormRequest != NULL)
2997 if (ormRequest->state == ORM_STATE_WAIT_CERT)
2999 assert(IS_HTTPS_REQUEST(ormRequest));
3000 ormRequest->state = ORM_STATE_QUEUED;
3001 ReprocessRequestList();
3003 ormRequest = ormRequest->next;
3012 static void ServerAccessCallback(
void)
3016 ormRequest = requestListHead;
3017 while (ormRequest != NULL)
3019 if ((IS_HTTP_REQUEST(ormRequest)) &&
3020 (ormRequest->state == ORM_STATE_WAIT_ACCESS))
3022 ormRequest->state = ORM_STATE_CHECK_ACCESS;
3024 ormRequest = ormRequest->next;
3026 ReprocessRequestList();
3034 static void VerificationCallback(
void)
3038 ormRequest = requestListHead;
3039 while (ormRequest != NULL)
3041 if ((IS_HTTP_REQUEST(ormRequest)) &&
3042 (ormRequest->state == ORM_STATE_WAIT_VERIFY))
3044 ormRequest->state = ORM_STATE_CHECK_VERIFY;
3046 ormRequest = ormRequest->next;
3048 ReprocessRequestList();
3058 static void AppendData(HttpReplyBuffer *hcontent, U8BIT *data, U32BIT dataLen)
3063 if (hcontent->valid)
3065 if (hcontent->allocated == 0)
3078 if (size < MIN_HTTP_REPLY_BLOCK)
3080 size = MIN_HTTP_REPLY_BLOCK;
3082 hcontent->data = MHEG5getMem(size + 1);
3083 if (hcontent->data != NULL)
3085 hcontent->allocated = size;
3086 hcontent->used = dataLen;
3087 memcpy(hcontent->data, data, dataLen);
3088 hcontent->data[hcontent->used] =
'\0';
3091 else if (hcontent->allocated >= hcontent->used + dataLen)
3093 memcpy(hcontent->data + hcontent->used, data, dataLen);
3094 hcontent->used += dataLen;
3098 size = hcontent->allocated;
3103 while (size < hcontent->used + dataLen);
3104 new_data = MHEG5getMem(size + 1);
3105 if (new_data != NULL)
3107 memcpy(new_data, hcontent->data, hcontent->used);
3108 memcpy(new_data + hcontent->used, data, dataLen);
3109 MHEG5freeMem(hcontent->data);
3110 hcontent->allocated = size;
3111 hcontent->used += dataLen;
3112 hcontent->data = new_data;
3113 hcontent->data[hcontent->used] =
'\0';
3117 MHEG5freeMem(hcontent->data);
3119 hcontent->allocated = 0;
3120 hcontent->valid = FALSE;
3132 static void ReprocessRequestList(
void)
3148 static void ProcessRequestList(
void)
3151 MHEG5Bool requestDone;
3153 ormRequest = requestListHead;
3154 while (ormRequest != NULL)
3158 (ormRequest->type == ORM_TYPE_POST)? PostProcess(ormRequest) :
3160 DefaultGetProcess(ormRequest);
3164 ormFunctions[ormRequest->origin].Clear(ormRequest);
3167 ormRequest = requestListHead;
3171 ormRequest = ormRequest->next;
3176 #if !defined(CI_PLUS_ONLY) || defined(INCLUDE_IC) 3186 ormRequest = requestListHead;
3187 while (ormRequest != NULL)
3189 if (ormRequest->requestId == requestId)
3193 ormRequest = ormRequest->next;
Implement MHEG5 engine control functions (i.e. start/stop etc)
E_MhegErr VQ_PutMsg(S_MhegMessage *pMsg, E_PRIORITY priority)
Post event or section message on queue. Copies data into queue.
void MHEG5AddTlsCertificateCallback(void(*loadCallback)(void))
Add a callback function to be called when pending requests are resolved.
MHEG5ContentVerification_t MHEG5IsContentVerified(U8BIT *url, U8BIT *content, U32BIT length)
void MHEG5sendAppEngineEvent(E_ENGINE_EVENT engine_event)
Store an Engine event in the asynchronous event queue.
Functions relating to HTTPS Signature Certificates.
File acceleration for Australia and Souh Africa.
Interface functions to DSM-CC instance for MHEG5.
void httpStartRequest(HttpRequest_t request)
Start an HTTP request. Everything related to the request is passed through the callback that was regi...
Manages the interface between MHEG5 Engine and the HTTP component.
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 MHEG5ciFileAcknowledge(BOOLEAN fileOK, U8BIT *pFileData, U32BIT length)
Process the FileAcknowledge message sent from the CI module.
MHEG5Bool MHEG5parseUrl(U8BIT *buffer, U32BIT length, S_DVB_LOCATOR *multiplexRef)
Parse a DAVIC style multiplex reference or UK-DTT inherritance format URL. This can be one of the fol...
MHEG5Int MHEG5FullOriginLength(E_FS_ORIGIN origin)
Get length for origin (e.g. "DSM://" is 6)
HttpRequest_t httpCreateHeadRequest(U8BIT *url, HttpCallback_t callback, U32BIT request_id, void *userdata)
Create an HTTP HEAD request.
Implement the MHEG5 Stream Class Stream Class Defines the behaviour of a composition of continuous me...
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.
void MHEG5InitMappingIter(MHEG5MappingIter_t *iter, void *mapping)
Initialise hybrid filesystem mapping iterator.
void * MHEG5_DsmccInstance(void)
Get the DSMCC instance handle.
MHEG5Bool MHEG5streamGetCurrentService(S_DVB_LOCATOR *multiplexRef)
Return the current service (i.e. the service corresponding to the currently running Video...
MHEG5String MHEG5stringCopy(MHEG5String source)
<Function description>="">
BOOLEAN MHEG5FileOrmProcess(void)
Check for any file requests that have arrived since this function was last called. For each arrived file the callback will be called. The function may have to be called more than once in case a file the arrived affects other files as well.
MHEG5TlsCertRequestStatus MHEG5GetNextTlsCertificate(void)
Issues a request to load the next TLS certificate from the DSM-CC object carousel.
void MHEG5FileOrmPreloadHint(MHEG5String name)
Provide a preload hint to DSM-CC that the specified file may be required in the future. DSM-CC could (but is not required to) acquire the file into cache.
void MHEG5stringDestruct(MHEG5String *item)
Destruct a MHEG5String.
void(* F_MSG_PROCESS)(void *data)
Function to Process voyager message.
void MHEG5SetVerificationCallback(void(*callback)(void))
Register a callback to be fired when the state of the verification subsystem changes.
DVB Service information functions are required by MHEG5 engine. All required functions should be non-...
void * STB_MemAlloc(U32BIT memSize)
Allocates the specified number of bytes.
U8BIT * httpGetRequestRedirect(HttpRequest_t request)
Return the URL that the request is redirected to (valid only for response codes of 3xx)...
This file defines the profile for the MHEG engine.
void MHEG5AddServerAccessCallback(void(*LoadNotifyCallback)(void))
Add callback function to be called when the server access permission file is loaded.
void MHEG5FileOrmInit(void)
Initialise the file ORM module.
HttpRequest_t httpCreatePostRequest(U8BIT *url, U8BIT *data, HttpCallback_t callback, U32BIT request_id, void *userdata)
Create an HTTP POST request.
Implement Functions to support Service Gateways. Functions for standarizing several GroupIDs like +DS...
MHEG5String MHEG5convertGIDGetOrigin(MHEG5String *inRef, E_FS_ORIGIN *pOrigin)
Convert a group ID from a relative reference to an absolute reference. See UK1.05 section 8...
MHEG5ServerAccess_t MHEG5CheckServerPermitted(U8BIT *url)
Event handling. Implementation of a combined queue for events and actions. This is the eventsystem wh...
Functions relating to HTTPS Server Access.
Functions relating to HTTPS Content Verification.
void httpStopRequest(HttpRequest_t request)
Stop an HTTP request. This function does not destroy the request; this is done using httpDestroyReque...
void MHEG5ResetHashFile(U8BIT *url)
Reset the state and clear cache of the hashfile associated with a content file.
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 ...
Implement functions to retrieve MHEG5objects by GroupID and ID.
void MHEG5FileOrmClear(void *orm_ref)
Remove outstanding file request for the given handle.
Mheg5 logging and debug printing.
void * MHEG5GetHybridFileSystemMapping(MHEG5String *reference)
Return mapping from the hybrid file system given path name. The mapping must be released using MHEG5R...
File interface functions to DSMCC component.
void MHEG5FileOrmReset(MHEG5FileOrmResetMode resetMode)
Reset the ORM module. This function supports two modes:
U32BIT MHEG5GetTlsCertStoreCount(void)
Return number of TLS certificates in the TLS certificate store.
Functions relating to TLS certificate store.
The timer module allows the use of timers within the MHEG5 component. These timers can be set by othe...
void MHEG5ReleaseHybridFileSystemMapping(void *mapping)
Release mapping returned from the hybrid file system. The mapping must be have been returned by a cal...
MHEG5String MHEG5CreateUrl(E_FS_ORIGIN origin, S_STRING path, S_STRING name)
Convert a group ID from a relative reference to an absolute reference. See UK1.05 section 8...
void httpDestroyRequest(HttpRequest_t request)
Destroy an HTTP request.
MHEG5String MHEG5GetNextReference(MHEG5String *reference, MHEG5MappingIter_t *iter)
Return next reference from mapping iterator.
void * MHEG5FileOrmGet(MHEG5String name, U16BIT priority, void *userData, F_CB_Good cbGood, F_CB_Fail cbFail)
Get a file. The file will be loaded and one of the callback functions called when request is resolved...
HttpRequest_t httpCreateGetRequest(U8BIT *url, U8BIT cachePriority, HttpCallback_t callback, U32BIT request_id, void *userdata)
Create an HTTP GET request.
E_MhegErr DVB_MhegDvbLocatorToIndex(S_DvbLocator *pDvbLocator, S32BIT *pServiceIndex)
Get a DVB implementation dependant service index - an integer greater or equal to 0...
E_FsStatus FG_FileExists(E_FS_ORIGIN origin, const char *fname)
Request file from file group stores.
BOOLEAN MHEG5FileOrmIsReset(MHEG5FileOrmResetMode *resetMode)
Tell whether the ORM module is currently being reset. If it is, the function also returns the current...
Functions relating to Hybrid file system.
E_MhegErr VT_TimerDestroy(H_Timer timerHandle)
Destroy the specified timer. A callback will not be invoked for this timer after this function return...