38 #define NEWLOG(x, ...) if (pSetup->errPrintf) \
39 pSetup->errPrintf( x "\n", ##__VA_ARGS__);
43 typedef struct s_SiqRequests
45 struct s_SiqRequests *next;
47 H_SIQueryRef dsmQueryRef;
75 if (pSetup->memAlloc == NULL)
77 NEWLOG(
"memAlloc NULL")
79 else if (pSetup->memFree == NULL)
81 NEWLOG(
"memFree NULL")
83 else if (pSetup->dvpRequestTable == NULL)
85 NEWLOG(
"dvpRequestTable NULL")
87 else if (pSetup->dvpCancelTable == NULL)
89 NEWLOG(
"dvpCancelTable NULL")
91 else if (pSetup->parseDataBroadcastId == NULL &&
92 pSetup->parseSsuSelectorBytes == NULL)
94 NEWLOG(
"parseDataBroadcastId or parseSsuSelectorBytes is NULL")
106 if (!SIQ_CacheInit( siq ))
108 pSetup->memFree( siq );
127 F_Printf dbgPrintf, U32BIT dbgState )
130 siq->setup.errPrintf = errPrintf;
131 siq->setup.dbgPrintf = dbgPrintf;
132 siq->setup.dbgState = dbgState;
144 siq->setup.dbgState = dbgState;
154 S_SiqRequests *pRequest, *pr;
156 pRequest = siq->queryHead;
157 while (pRequest != NULL)
159 ERRLOG(
"Leaked Query kind=%d srv_id=%d", pRequest->query.kind, pRequest->query.serviceId)
161 pRequest = pRequest->next;
162 siq->setup.memFree( pr );
165 SIQ_CacheExit( siq );
167 siq->setup.memFree( siq );
179 siq->dsmInstance = dsmInstance;
190 H_SIQueryRef dsmQueryRef,
void *dsmUserData,
193 S_SiqRequests *pRequest;
198 hpmt = SIQ_CacheRetrievePmt( siq, pQuery->serviceId, &gettingPmt );
202 if (pResult->kind == SIRESULT_FAILURE)
204 DBGLOG(DS_QUERY,
"SIQ_PmtProcessQuery(kind=%d) failed", pQuery->kind)
205 err = CLDSM_ERR_SI_QUERY_FAILED;
212 else if (!gettingPmt)
214 ERRLOG(
"Eek! SIQ_CacheRetrievePmt(serv_id=%d) failed, and not getting PMT either! Q-kind=%d", pQuery->serviceId, pQuery->kind)
215 err = CLDSM_ERR_INVALID_SIQUERY_STATUS;
219 pRequest = siq->setup.memAlloc(
sizeof(S_SiqRequests));
220 if (pRequest == NULL)
222 err = CLDSM_ERR_ALLOC_FAILED;
226 DBGLOG(DS_QUERY,
"Pending Query request serviceId=%d kind=%d", pQuery->serviceId, pQuery->kind)
227 pRequest->query = *pQuery;
228 pRequest->dsmQueryRef = dsmQueryRef;
229 pRequest->dsmUserData = dsmUserData;
231 pRequest->next = siq->queryHead;
232 siq->queryHead = pRequest;
234 pResult->kind = SIRESULT_PENDING;
235 pResult->data.queryHandle = pRequest;
249 void *queryHandle, H_SIQueryRef dsmQueryRef )
251 S_SiqRequests **ppRequest, *pRequest;
253 ppRequest = &(siq->queryHead);
254 while (*ppRequest != NULL)
256 if (*ppRequest == queryHandle)
258 pRequest = *ppRequest;
259 ASSERT( pRequest->dsmQueryRef == dsmQueryRef );
260 *ppRequest = pRequest->next;
261 siq->setup.memFree( pRequest );
264 ppRequest = &((*ppRequest)->next);
268 void SIQ_DeleteQueriesOnService(
S_SiqInstance *siq, U16BIT serviceId)
270 S_SiqRequests **ppRequest, *pRequest;
272 ppRequest = &(siq->queryHead);
273 while (*ppRequest != NULL)
275 pRequest = *ppRequest;
276 if (pRequest->query.serviceId == serviceId)
278 *ppRequest = pRequest->next;
279 siq->setup.memFree( pRequest );
283 ppRequest = &((*ppRequest)->next);
295 S_SiqRequests **ppRequest, *pRequest;
299 pRequest = siq->queryHead;
300 ppRequest = &(siq->queryHead);
301 while (pRequest != NULL)
303 DBGLOG(DS_QUERY,
"pRequest=%p ppRequest=%p", pRequest, ppRequest)
304 if (pRequest->query.serviceId == serviceId)
306 *ppRequest = pRequest->next;
309 pRequest->dsmQueryRef, pRequest->dsmUserData, &result ) != CLDSM_OK)
311 ERRLOG(
"clDsmSysProcessSIQueryEvent: failed")
313 siq->setup.memFree( pRequest );
317 ppRequest = &(pRequest->next);
318 DBGLOG(DS_QUERY,
"ppRequest=%p", ppRequest)
320 pRequest = *ppRequest;
E_DscError SIQ_RequestQueryStart(S_SiqInstance *siq, P_SIQueryRequest pQuery, H_SIQueryRef dsmQueryRef, void *dsmUserData, P_SIQueryResult pResult)
Start query request. Called by DSM-CC component.
H_SiqInstance SIQ_CreateInstance(S_SiqSetup *pSetup)
Create SIQ instance.
void SIQ_SetDebugConfig(H_SiqInstance siq, F_Printf errPrintf, F_Printf dbgPrintf, U32BIT dbgState)
Set Debug config for SIQ.
void SIQ_DestroyInstance(H_SiqInstance siq)
Destroy instance created by SIQ_CreateInstance.
E_DscError CDSM_SysProcessSIQueryEvent(H_DsmCoreInst instance, H_SIQueryRef clDsmSIQueryRef, void *clDsmSIUserData, P_SIQueryResult pResult)
Notifies the result of the specified SI query (ie. a callback to startSIQueryFunc that returned SIQUE...
Main API to DSM-CC core layer (provided functions and required callbacks).
void SIQ_QueryPmtReceive(S_SiqInstance *siq, U16BIT serviceId, H_SiqPmtTable hpmt)
Service Information Query: debug definitions.
void SIQ_SetDebugState(H_SiqInstance siq, U32BIT dbgState)
Set Debug state for SIQ.
Service Information Query: cache functionality.
Service Information Query: PMT parsing functions.
void SIQ_PmtProcessQuery(S_SiqInstance *siq, P_SIQueryRequest pQuery, H_SiqPmtTable hpmt, P_SIQueryResult pResult)
Retrieve Information required by Query request from SIQ's PMT table.
Service Information Query: main definitions.
void SIQ_SetDsmInstance(H_SiqInstance siq, H_DsmCoreInst dsmInstance)
Set instance handle for DSM-CC that SIQ is supporting.
void SIQ_RequestQueryStop(S_SiqInstance *siq, void *queryHandle, H_SIQueryRef dsmQueryRef)
Stop query request. Called by DSM-CC component.