50 #define MAX_REG_STRINGS 32 66 MHEG5Link *activeLinksHead[MHEG5LASTEVENT + 1];
67 unsigned int existsLinkCount[MHEG5LASTEVENT + 1];
70 static int numberRegistered;
72 static const char htext_top[] =
"rec://htext/top";
73 static const char htext_bot[] =
"rec://htext/bot";
89 void MHEG5linkPrint(
MHEG5Link *link,
char *out)
91 MHEG5ingredientPrint(&link->ingredient, out);
93 MHEG_PRINT(out,
":EventSource ");
94 if (link->sourcegid.len)
97 MHEG5stringPrint(*((
MHEG5String *)&link->sourcegid), out);
99 MHEG5intPrint(link->source, out);
100 MHEG_PRINT(out,
")");
103 MHEG5intPrint(link->source, out);
106 MHEG_PRINT(out,
":EventType ");
107 MHEG5eventPrint(link->eventType, out);
110 if (link->eventData.type != MHEG5NONE)
112 MHEG_PRINT(out,
":EventData ");
113 MHEG5genericPrint(link->eventData, out, 0);
117 MHEG_PRINT(out,
":LinkEffect (");
119 MHEG5actionPrint(link->linkEffect, out);
121 MHEG_PRINT(out,
")");
131 for (et = MHEG5NONEEVENT; et != (MHEG5LASTEVENT + 1); et++)
133 activeLinksHead[et] = 0;
134 existsLinkCount[et] = 0;
137 registeredStrings[0].str.len = 0;
138 registeredStrings[0].str.data = NULL;
139 registeredStrings[0].numLinks = 0;
141 registeredStrings[HTEXT_TOP_STR].str.len = 15;
142 registeredStrings[HTEXT_TOP_STR].str.data = (MHEG5Byte *)htext_top;
143 registeredStrings[HTEXT_TOP_STR].numLinks = 0;
144 registeredStrings[HTEXT_BOT_STR].str.len = 15;
145 registeredStrings[HTEXT_BOT_STR].str.data = (MHEG5Byte *)htext_bot;
146 registeredStrings[HTEXT_BOT_STR].numLinks = 0;
147 for (i = 3; i != MAX_REG_STRINGS; i++)
149 registeredStrings[i].str.len = 0;
150 registeredStrings[i].str.data = NULL;
151 registeredStrings[i].numLinks = 0;
153 numberRegistered = 3;
161 registeredStrings[0].numLinks++;
164 for (i = 1; i != MAX_REG_STRINGS; i++)
166 if ((registeredStrings[i].str.len == s.len) &&
167 (memcmp(registeredStrings[i].str.data, s.data, s.len) == 0))
170 registeredStrings[i].numLinks++;
173 else if (registeredStrings[i].str.len == 0)
175 if (i == numberRegistered)
179 registeredStrings[i].numLinks = 1;
180 registeredStrings[i].str.len = s.len;
181 registeredStrings[i].str.data = s.data;
195 for (i = 1; i != numberRegistered; i++)
197 if ((registeredStrings[i].str.len == s.len) &&
198 (memcmp(registeredStrings[i].str.data, s.data, s.len) == 0))
208 return registeredStrings[i].str;
211 static void LNK_FreeString( MHEG5Int ndx )
213 int i = numberRegistered - 1;
214 if (registeredStrings[ndx].numLinks)
216 registeredStrings[ndx].numLinks--;
218 if ((ndx > HTEXT_BOT_STR) &&
219 registeredStrings[ndx].str.len &&
220 !registeredStrings[ndx].numLinks)
226 while ((i != HTEXT_BOT_STR) && !registeredStrings[i].str.len)
228 numberRegistered = i + 1;
232 U8BIT* MHEG5linkEventName(
MHEG5Link *link )
235 if (link->eventData.type == (U16BIT)MHEG5INT)
237 eventName = LNK_GetString((
int)link->eventData.value.i );
241 assert( link->eventData.type == (U16BIT)MHEG5NONE );
242 eventName.data = NULL;
244 return eventName.data;
258 link->eventData.indirect = MHEG5FALSE;
259 link->eventData.type = MHEG5NONE;
274 assert( existsLinkCount[link->eventType] > 0 );
275 existsLinkCount[link->eventType]--;
279 if (link->eventData.indirect)
281 LNK_FreeString( link->eventData.value.i );
286 if (link->sourcegid.len)
288 name.len = link->sourcegid.len;
289 name.data = link->sourcegid.ptr.name;
333 if (!link->ingredient.root.runningStatus)
335 if (!link->ingredient.root.availabilityStatus)
337 MHEG5linkPrepare( link );
342 link->ingredient.root.runningStatus = MHEG5TRUE;
345 if (!(mheg_trace_debug & TACTIONS))
347 TRACE(TEVNTS, (
"link %d, src:%d typ:%s", link->ingredient.root.id, link->source, MHEG5eventToString(link->eventType)))
354 MHEG5Link *listItem = activeLinksHead[link->eventType];
355 while (listItem != 0)
357 assert(listItem != link);
358 listItem = listItem->nextActiveLink;
365 link->nextActiveLink = activeLinksHead[link->eventType];
366 activeLinksHead[link->eventType] = link;
370 if (link->eventType == MHEG5STREAMEVENT)
385 void MHEG5linkDeactivate(
MHEG5Link *link)
389 if (link->ingredient.root.runningStatus)
391 if (link->eventType == MHEG5STREAMEVENT)
399 if (!(mheg_trace_debug & TACTIONS))
401 TRACE(TEVNTS, (
"link %d, src:%d typ:%s", link->ingredient.root.id, link->source, MHEG5eventToString(link->eventType)))
407 if (activeLinksHead[link->eventType] == link)
412 activeLinksHead[link->eventType] = link->nextActiveLink;
416 MHEG5Link *listItem = activeLinksHead[link->eventType];
420 while (listItem->nextActiveLink != 0)
422 if (listItem->nextActiveLink == link)
427 listItem->nextActiveLink = link->nextActiveLink;
430 listItem = listItem->nextActiveLink;
438 ERROR_PRINT((
"ERROR: MHEG5linkDeactivate - couldn't find link in active list\n"));
460 if (target->clazz != MHEG5LINK)
462 return MHEG5ERR_WRONGTARGET;
465 if (!target->runningStatus)
470 return MHEG5ERR_NOERROR;
487 if (target->clazz != MHEG5LINK)
489 return MHEG5ERR_WRONGTARGET;
492 if (target->runningStatus)
494 MHEG5linkDeactivate((
MHEG5Link *) target);
497 return MHEG5ERR_NOERROR;
void MHEG5ingredientInit(MHEG5Ingredient *ingredient)
Initialise a ingredient object with default values.
void MHEG5linkFree(MHEG5Link *link)
Free off all memory associated with the specified object, including any exchanged attributes and inte...
void initialiseActiveLinkQs(void)
<Function description>="">
void MHEG5notifyLinkActive(MHEG5Link *link)
Notify that a link is active.
Event to String conversion.
void MHEG5ingredientDestruct(MHEG5Ingredient *ingredient)
Implementation of the Destruction behaviour Execute the following sequence of actions: ...
Stream event subscription management.
Implement the MHEG5 Variable Class 21 Variable Class Defines a variable within the context of a Group...
void MHEG5stringDestruct(MHEG5String *item)
Destruct a MHEG5String.
Implement the MHEG5 Link Class. Defines the functionality associated with reacting to events by perfo...
void MHEG5notifyLinkInactive(MHEG5Link *link)
Notify that a link has become inactive.
Event handling. Implementation of a combined queue for events and actions. This is the eventsystem wh...
void MHEG5ingredientDeactivate(MHEG5Ingredient *ingredient)
Implementation of Deactivate behaviour Inherrited from Root class.
Implement functions to retrieve MHEG5objects by GroupID and ID.
void MHEG5ingredientPrepare(MHEG5Ingredient *ingredient)
Implementation of the Preparation behaviour Inherrited from Root class.
Mheg5 logging and debug printing.
void MHEG5actionDestruct(MHEG5ActionList actions)
<Function description>="">
void MHEG5queueUnresolveTargets(MHEG5ActionList actions)
Clear targets for the action list.
void MHEG5queueResolveTargets(MHEG5ActionList actions)
Finds targets for the action list.
void MHEG5linkInit(MHEG5Link *link)
Initialise a link object with default values.
void MHEG5ingredientFree(MHEG5Ingredient *ingredient)
Free off all memory associated with the specified object, including any exchanged attributes and inte...
void MHEG5sendSync(MHEG5Root *source, MHEG5EventType event, MHEG5Int data)
Store an event in the synchronous event queue.