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" : \ 216 typedef struct HttpReplyBuffer_struct
232 void (*Action)(P_OrmRequest request);
233 void (*Clear)(P_OrmRequest request);
258 #ifdef CHECK_ORM_MAGIC 273 void *hybrid_mapping;
289 #ifdef COMMON_INTERFACE 293 static U16BIT ciRequestCount = 0;
294 static H_Timer ciAckTimerHandle = NULL;
297 static U32BIT globalRequestId = 0;
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 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 386 static void ReprocessRequestList(
void);
387 static void ProcessRequestList(
void);
389 #if defined(CI_PLUS_ONLY) || !defined(COMMON_INTERFACE) || !defined(INCLUDE_IC) 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;
426 static P_OrmRequest DvbAlloc(
void)
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;
602 currentResetMode = resetMode;
604 ormRequest = requestListHead;
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);
686 if (ciRequestCount != 0)
688 if (ciAckTimerHandle != NULL)
691 ciAckTimerHandle = NULL;
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;
748 const char digits[16] =
"0123456789ABCDEF";
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 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)
850 RemoveFromCiMessageContextList(ciItem);
868 ciItem = ciMessageListHead;
882 ciMessageSent =
TRUE;
888 ciItem = ciItem->
next;
892 ERROR_PRINT((
"MHEG5FileOrmProcess : error from ciFileRequest\n"));
898 RemoveFromCiMessageContextList(ciItem);
903 ciItem = ciMessageListHead;
908 ciItem = ciItem->
next;
984 ormRequest = requestListHead;
986 while (ormRequest != NULL)
989 next = ormRequest->
next;
995 RemoveFromRequestList(ormRequest);
999 ormFunctions[ormRequest->
origin].
Clear(ormRequest);
1001 next = requestListHead;
1019 ormRequest = requestListHead;
1024 next = ormRequest->
next;
1040 strcmp((
char *)ormRequest->
url.
data, (
char *)url.
data) == 0)
1049 RemoveFromRequestList(ormRequest);
1052 ormFunctions[ormRequest->
origin].
Clear(ormRequest);
1061 #ifdef INCLUDE_DSM_FG 1067 ormRequest = requestListHead;
1068 while (ormRequest != NULL)
1075 TRACE(TFILE, (
" Got size=%d, for:%s", content->
size, ormRequest->
url.
data));
1085 TRACE(TFILE, (
" Failed to get %s", ormRequest->
url.
data));
1099 TRACE(TERROR, (
" STILL PENDING! %s", ormRequest->
url.
data))
1105 TRACE(TERROR, (
"UNKNOWN return %d for %s", status, ormRequest->
url.
data))
1111 ormRequest = ormRequest->
next;
1126 status =
FG_LoadRequest( origin, (
char *)path, FileGroupComplete,
1134 ReprocessRequestList();
1142 ReprocessRequestList();
1154 TRACE(TFILE, (
"(%s) stat %d", ormRequest->
url.
data, status));
1156 ReprocessRequestList();
1183 #if defined(INCLUDE_DSM_FG) || defined(TRACING) 1187 P_OrmRequest ormRequest;
1190 assert( cbGood != NULL );
1191 assert( cbFail != NULL );
1203 #if defined(INCLUDE_DSM_FG) || defined(TRACING) 1206 buildName(name, &url, &origin);
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;
1240 ormRequest->
requestId = ++globalRequestId;
1241 ud.
u32 = globalRequestId;
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);
1262 requestDone = DefaultGetProcess(ormRequest);
1265 ormFunctions[origin].
Clear(ormRequest);
1294 P_OrmRequest ormRequest;
1297 assert( cbGood != NULL );
1298 assert( cbFail != NULL );
1299 assert( name.
zlen );
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;
1334 ormRequest->
requestId = ++globalRequestId;
1335 ud.
u32 = globalRequestId;
1342 TRACE(TFILE, (
"Ptr=%p url=%s", ormRequest, url.
data))
1345 AddToRequestList(ormRequest);
1346 ormFunctions[origin].
Action(ormRequest);
1351 requestDone = DefaultGetProcess(ormRequest);
1354 ormFunctions[origin].
Clear(ormRequest);
1364 #ifdef COMMON_INTERFACE 1382 DEBUG_PRINT((
"INFO: MHEG5FileOrmSendCiMessage ( %.*s, 0x%x )\n", input.
len, input.
data));
1388 ERROR_PRINT((
"ERROR: MHEG5FileOrmSendCiMessage unable to allocate memory\n"));
1407 memcpy(&data[1], input.
data, input.
len);
1410 AddToCiMessageContextList(w);
1415 retval = STB_CIFileRequest(MHEG5GetCiModuleId(), data, input.
len + 1);
1421 ciMessageSent =
TRUE;
1429 ERROR_PRINT((
"ERROR: MHEG5FileOrmSendCiMessage ciFileRequest retval is %d\n", retval));
1432 RemoveFromCiMessageContextList(w);
1448 ERROR_PRINT((
"ERROR: MHEG5FileOrmSendCiMessage unable to allocate memory\n"));
1491 buildName(name, &url, &origin);
1500 ormRequest = ormFunctions[origin].
Alloc();
1501 if (ormRequest == NULL)
1503 TRACE(TERROR, (
"memory failure, or origin not supported; url=%s", url.
data))
1509 ormRequest->
url = url;
1510 ormRequest->
origin = origin;
1513 ormRequest->
requestId = ++globalRequestId;
1517 AddToRequestList(ormRequest);
1518 ormFunctions[origin].
Action(ormRequest);
1521 TRACE(TFILE, (
"Ptr=%p url=%s", ormRequest, url.
data))
1523 requestDone = PostProcess(ormRequest);
1526 ormFunctions[origin].
Clear(ormRequest);
1531 TRACE(TFILE,(
"url = \"%s\"", (
char *)url.
data));
1537 ERROR_PRINT((
"MHEG5FileOrmReturnData : Unexpected result\n"));
1558 #ifndef CI_PLUS_ONLY 1570 #ifndef CI_PLUS_ONLY 1571 buffer = buildName(name, &url, &origin);
1578 buildName(name, &url, &origin);
1584 #ifndef CI_PLUS_ONLY 1596 ormRequest = FindRequest(ud.
u32);
1597 if (ormRequest != NULL)
1613 TRACE(TFILE, (
" Failed to get %s", ormRequest->
url.
data));
1627 TRACE(TERROR, (
" STILL PENDING! %s", ormRequest->
url.
data))
1646 if (ormRequest != NULL)
1648 TRACE(TFILE, (
"ptr=%p url:%s size=%u", ormRequest, ormRequest->
url.
data, content->
size ));
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)
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))
1728 ormRequest = ormRequest->
next;
1731 else if (pFileData[0] == 0x01)
1734 ciMessageSent =
FALSE;
1737 ciItem = ciMessageListHead;
1738 while (ciItem != NULL)
1751 ciItem = ciItem->
next;
1756 if (ack && pFileData != NULL)
1759 MHEG5CiAckData(pFileData);
1777 static void HybridGetCallback(
void *userData,
S_CONTENT *ocontent )
1791 ReprocessRequestList();
1801 static void HybridGetFailCallback(
void *userData )
1816 ReprocessRequestList();
1840 ormRequest = FindRequest(requestId);
1845 TRACE(TFILE, (
"code=%d", code))
1846 if (((code >= 301) && (code <= 305)) || (code == 307))
1851 HttpRedirect(ormRequest);
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)
1871 TRACE(TFILE, (
"Ptr=%p FAIL url=%s", ormRequest, ormRequest->
url.
data))
1887 releaseData =
FALSE;
1891 VerifyRequestContent(ormRequest);
1898 ReprocessRequestList();
1907 TRACE(TFILE, (
"Network error Ptr=%p FAIL url=%s", ormRequest, ormRequest->
url.
data))
1913 TRACE(TFILE, (
"response mod Ptr=%p FAIL url=%s", ormRequest, ormRequest->
url.
data))
1919 TRACE(TFILE, (
"status=%d Ptr=%p FAIL url=%s", status, ormRequest, ormRequest->
url.
data))
1929 releaseData =
FALSE;
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;
1978 AppendData(hcontent, response->
data, response->
data_len);
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;
1994 TRACE(TERROR, (
"VQ_PutMsg failed", cqu_err));
2011 static BOOLEAN HttpPostCallback(
void *userdata,
U32BIT requestId,
2014 HttpReplyBuffer *hcontent = userdata;
2020 AppendData(hcontent, response->
data, response->
data_len);
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;
2036 TRACE(TERROR, (
"VQ_PutMsg failed", cqu_err));
2049 #ifndef CI_PLUS_ONLY 2065 TRACE(TFILE,(
"Fetching url: %s", (
char *)ormRequest->
url.
data));
2070 flags |= LOAD_FLAGS_REQUEST_EXISTANCE_BIT;
2074 flags |= LOAD_FLAGS_REQUEST_DEFERRED_SERVICE_BIT;
2078 flags |= LOAD_FLAGS_REQUEST_FILE_ONLY_BIT;
2083 TRACE(TFILE, (
"url=%s, rtn=%d", ormRequest->
url.
data, retval))
2089 ReprocessRequestList();
2095 ReprocessRequestList();
2105 TRACE(TFILE, (
"dsmFLoad(%s) retval is %d\n", ormRequest->
url.
data, retval));
2107 ReprocessRequestList();
2113 #ifndef CI_PLUS_ONLY 2124 TRACE(TFILE, (
"Ptr=%p url(%d)=%s", ormRequest,ormRequest->
url.
len,ormRequest->
url.
data))
2152 &dvbMultiplexReference );
2168 ReprocessRequestList();
2200 TRACE(TFILE,(
"Fetching url: %s", (
char *)ormRequest->
url.
data));
2202 reference.
len = ormRequest->
url.
len - 7;
2205 if (ormRequest->hybrid_mapping == NULL)
2213 if (mapped.
len != 0)
2221 path.
zlen = mapped.
len - offset;
2226 ormRequest, HybridGetCallback, HybridGetFailCallback );
2232 HybridGetCallback, HybridGetFailCallback );
2239 ormRequest->hybrid_mapping = NULL;
2241 ReprocessRequestList();
2264 TRACE(TFILE,(
"ptr=%p url=\"%s\"",ormRequest,(
char *)ormRequest->
url.
data));
2270 assert(childRequest->
userData == ormRequest);
2273 RemoveFromRequestList(childRequest);
2275 ormFunctions[childRequest->
origin].
Clear(childRequest);
2278 if (ormRequest->hybrid_mapping != NULL)
2281 ormRequest->hybrid_mapping = NULL;
2308 RemoveFromRequestList(ormRequest);
2310 TRACE(TFILE, (
"Ptr=%p GOT IT url=%s", ormRequest, ormRequest->
url.
data))
2323 TRACE(TFILE, (
"Delay process of file, url=%s", ormRequest, ormRequest->
url.
data))
2329 RemoveFromRequestList(ormRequest);
2331 TRACE(TFILE, (
"Ptr=%p FAIL url=%s", ormRequest, ormRequest->
url.
data))
2343 RemoveFromRequestList(ormRequest);
2345 TRACE(TFILE, (
"Ptr=%p ABORT url=%s", ormRequest, ormRequest->
url.
data))
2353 TRACE(TFILE, (
"Ptr=%p QUEUE url=%s", ormRequest, ormRequest->
url.
data))
2362 TRACE(TFILE, (
"Ptr=%p OK url=%s", ormRequest, ormRequest->
url.
data))
2396 if (redirectUrl != NULL)
2399 name.
data = redirectUrl;
2400 name.
len = strlen((
char *)redirectUrl);
2401 buildName(name, &url, &origin);
2405 ormRequest->
url = url;
2406 ormRequest->
origin = origin;
2408 ++ormRequest->redirectCount;
2409 ormRequest->certCount = 0;
2411 ReprocessRequestList();
2437 RemoveFromRequestList(ormRequest);
2456 #ifdef COMMON_INTERFACE 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;
2514 length = ormRequest->
url.
len;
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);
2550 TRACE(TFILE, (
"Ptr=%p url(%d)=%s", ormRequest,ormRequest->
url.
len,ormRequest->
url.
data))
2575 static BOOLEAN HttpExistsCallback(
void *userdata,
U32BIT requestId,
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;
2594 TRACE(TERROR, (
"VQ_PutMsg failed", cqu_err));
2612 TRACE(TFILE,(
"Fetching / checking url \"%s\"", (
char *)ormRequest->
url.
data));
2615 MHEG5isConnectionEnabled(&connectionEnabled);
2616 if (connectionEnabled)
2623 CheckServerAccess(ormRequest);
2628 CheckTlsCertificates(ormRequest);
2633 PerformHttpRequest(ormRequest);
2638 VerifyRequestContent(ormRequest);
2643 ReprocessRequestList();
2655 ReprocessRequestList();
2670 TRACE(TFILE, (
"Ptr=%p url(%d)=%s", ormRequest,ormRequest->
url.
len,ormRequest->
url.
data))
2708 static void CheckServerAccess(
S_OrmRequest *ormRequest)
2715 if (ormRequest->redirectCount > 0)
2752 PRINT_ERROR((
"Invalid server access permission\n"));
2772 static void CheckTlsCertificates(
S_OrmRequest *ormRequest)
2783 if (certCount == 0 || ormRequest->certCount == certCount)
2800 else if (ormRequest->certCount < certCount)
2803 ormRequest->certCount = certCount;
2819 static void PerformHttpRequest(
S_OrmRequest *ormRequest)
2823 HttpReplyBuffer *hcontent;
2825 U8BIT cachePriority;
2840 if (hcontent != NULL)
2842 hcontent->allocated = 0;
2844 hcontent->data = NULL;
2845 hcontent->valid =
TRUE;
2856 if (priority & FRP_EXISTS)
2878 TRACE(TFILE,(
"httpRequest =%p", httpRequest));
2889 if (httpRequest != NULL)
2908 static void VerifyRequestContent(
S_OrmRequest *ormRequest)
2928 TRACE(TFILE,(
"CONTENT_NOT_VERIFIED_SAME\n"));
2931 ReprocessRequestList();
2934 TRACE(TFILE,(
"CONTENT_NOT_VERIFIED_NEW\n"));
2937 ormRequest->certCount = 0;
2939 ReprocessRequestList();
2942 TRACE(TFILE,(
"CONTENT_VERIFIED_SIGNED\n"));
2945 ReprocessRequestList();
2948 TRACE(TFILE,(
"CONTENT_VERIFIED_UNSIGNED\n"));
2960 ReprocessRequestList();
2963 TRACE(TFILE,(
"CONTENT_VERIFICATION_PENDING\n"));
2990 static void TlsCertCallback(
void)
2994 ormRequest = requestListHead;
2995 while (ormRequest != NULL)
3001 ReprocessRequestList();
3003 ormRequest = ormRequest->
next;
3012 static void ServerAccessCallback(
void)
3016 ormRequest = requestListHead;
3017 while (ormRequest != NULL)
3024 ormRequest = ormRequest->
next;
3026 ReprocessRequestList();
3034 static void VerificationCallback(
void)
3038 ormRequest = requestListHead;
3039 while (ormRequest != NULL)
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)
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);
3105 if (new_data != NULL)
3107 memcpy(new_data, hcontent->data, hcontent->used);
3108 memcpy(new_data + hcontent->used, data, dataLen);
3110 hcontent->allocated = size;
3111 hcontent->used += dataLen;
3112 hcontent->data = new_data;
3113 hcontent->data[hcontent->used] =
'\0';
3119 hcontent->allocated = 0;
3120 hcontent->valid =
FALSE;
3132 static void ReprocessRequestList(
void)
3148 static void ProcessRequestList(
void)
3153 ormRequest = requestListHead;
3154 while (ormRequest != NULL)
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)
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)
BOOLEAN MH5GlueActiveState(void)
void(* Clear)(P_OrmRequest request)
void MHEG5sendAppEngineEvent(E_ENGINE_EVENT engine_event)
Store an Engine event in the asynchronous event queue.
P_OrmRequest(* Alloc)(void)
F_MSG_PROCESS proc_msg_func
Functions relating to HTTPS Signature Certificates.
File acceleration for Australia and Souh Africa.
MHEG5TlsCertRequestStatus
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(* F_CB_Good)(void *userData, S_CONTENT *content)
void MHEG5ciFileAcknowledge(BOOLEAN fileOK, U8BIT *pFileData, U32BIT length)
Process the FileAcknowledge message sent from the CI module.
void(* F_DESTROY)(FS_HANDLE fs_handle)
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.
unsigned char * STR_DataAlloc(unsigned int size)
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(* F_CB_Post)(void *userData, MHEG5String responseData, MHEG5Int responseCode)
void * MHEG5_DsmccInstance(void)
Get the DSMCC instance handle.
void(* F_CB_CiMsg)(void *userData, MHEG5String output, MHEG5Bool success)
MHEG5Bool MHEG5streamGetCurrentService(S_DVB_LOCATOR *multiplexRef)
Return the current service (i.e. the service corresponding to the currently running Video...
U16BIT transport_stream_id
struct S_DvbLocator S_DVB_LOCATOR
MHEG5String MHEG5stringCopy(MHEG5String source)
<Function description>="">
void(* Action)(P_OrmRequest request)
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.
U16BIT original_network_id
struct CiMessageContext_struct * next
void(* F_TimerCallback)(BOOLEAN triggered, void *callerRef, H_Timer timerHandle)
struct sOrmRequest * P_OrmRequest
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-...
struct sOrmPostRequest S_OrmPostRequest
#define IS_HTTP_REQUEST(r)
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.
void STR_DataFree(unsigned char *data, unsigned int size)
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...
#define VERIFY_ORM_MAGIC(r)
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...
struct CiMessageContext_struct CiMessageContext
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(* F_CB_Fail)(void *userData)
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 ...
struct sOrmRequest S_OrmRequest
#define IS_HTTPS_REQUEST(r)
#define MHEG5strncmp(a, b, n)
Implement functions to retrieve MHEG5objects by GroupID and ID.
void MHEG5FileOrmClear(void *orm_ref)
Remove outstanding file request for the given handle.
#define PRINTFILE(t, n, d, s)
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.
struct sOrmGetRequest S_OrmGetRequest
#define CLEAR_ORM_MAGIC(r)
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.
struct sOrmFuncs S_OrmFuncs
MHEG5ContentVerification_t
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...
#define ORM_STATE_STRING(r)
struct HttpRequest_tag * HttpRequest_t
#define MIN_HTTP_REPLY_BLOCK
HttpRequest_t httpCreateGetRequest(U8BIT *url, U8BIT cachePriority, HttpCallback_t callback, U32BIT request_id, void *userdata)
Create an HTTP GET request.
union s_mhg_message::@13 data
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...
void MH5GlueAddPostProcessFunc(F_PostProcess func)
#define MHEG5_ABSOLUTE_PATH_LENGTH