MHEG5  18.9.0
MHEG5 Documentation
mh5object.c
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright © 2014 The DTVKit Open Software Foundation Ltd (www.dtvkit.org)
3  * Copyright © 2004 Ocean Blue Software Ltd
4  * Copyright © 2000 Koninklijke Philips Electronics N.V
5  *
6  * This file is part of a DTVKit Software Component
7  * You are permitted to copy, modify or distribute this file subject to the terms
8  * of the DTVKit 1.0 Licence which can be found in licence.txt or at www.dtvkit.org
9  *
10  * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
11  * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES
12  * OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * If you or your organisation is not a member of DTVKit then you have access
15  * to this source code outside of the terms of the licence agreement
16  * and you are expected to delete this and any associated files immediately.
17  * Further information on DTVKit, membership and terms can be found at www.dtvkit.org
18  *******************************************************************************/
28 /*---includes for this file--------------------------------------------------*/
29 #include "mh5object.h"
30 #include "mh5gate.h"
31 #include "mh5application.h"
32 #include "mh5scene.h"
33 #include "mh5variable.h"
34 #include "mh5stream.h"
35 #include "mh5memory.h"
36 #include "mh5profile.h"
37 #include "mh5debug.h"
38 
39 /*---constant definitions for this file--------------------------------------*/
40 
41 
42 /*---local typedef structs for this file-------------------------------------*/
43 
44 /*---local (static) variable declarations for this file----------------------*/
45 
46 static const char dummy_str[] = "\0";
47 
48 /*---local function definitions----------------------------------------------*/
49 
50 /*---global function definitions---------------------------------------------*/
51 
57 {
58  assert(root);
59  return root->grp->groupName;
60 }
61 
62 /*
63  Find an object in Scene or Application Scope
64  */
66 {
67  MHEG5Ingredient *search = 0;
68  MH5GroupPtr pGroup;
69 
70  /* is object from current scene ? */
72  if (pGroup)
73  {
74  if ((pGroup == gref.ptr.group) ||
75  ((gref.len != 0) && MHEG5sameGroup(pGroup, gref)))
76  {
77  if (id == 0)
78  {
79  return (MHEG5Root *) pGroup;
80  }
81  else
82  {
83  search = pGroup->hashIngred[id & 0xff];
84  }
85  }
86  }
87 
88  /* is object from current application ? */
89  if (!search)
90  {
92  if (pGroup)
93  {
94  if ((pGroup == gref.ptr.group) ||
95  ((gref.len != 0) && MHEG5sameGroup(pGroup, gref)))
96  {
97  if (id == 0)
98  {
99  return (MHEG5Root *) pGroup;
100  }
101  else
102  {
103  search = pGroup->hashIngred[id & 0xff];
104  }
105  }
106  }
107  }
108 
109  while (search && (search->root.id != id))
110  {
111  search = search->hnxt;
112  }
113  return (MHEG5Root *) search;
114 }
115 
116 /*
117  * Resolve a direct Object Reference
118  *
119  * An object reference can by internal or external. An external reference is
120  * of the form :
121  * ( 'group_id_string' id )
122  * An internal reference is of the form
123  * id
124  * where group_id_string is an OctetString and id is an Integer.
125  */
127 {
128  MHEG5GList *next;
129 
130  assert(object);
131 
132  if (!params)
133  {
134  TRACE(TERROR, ("INTERNAL: NULL params")) *
135  object = 0;
136  next = 0;
137  }
138  else
139  {
140  switch (params->generic.type)
141  {
142  case MHEG5OBJECTREF:
143  case MHEG5OBJREFEXT:
144  *object = MHEG5findObject(params->generic.value.o.gref, params->generic.value.o.id);
145  if (*object == NULL)
146  {
147  TRACE(TEVNTS, ("Object reference %d not found", params->generic.value.o.id));
148  }
149  next = params->next;
150  break;
151 
152  default:
153  TRACE(TERROR, ("INTERNAL: type=%d", params->generic.type)) *
154  object = 0;
155  next = 0;
156  break;
157  }
158  }
159  return next;
160 }
161 
178  MH5GroupRef *pgroupRef,
179  MHEG5Int *id)
180 {
181  MHEG5Root *object;
182  MHEG5GList *next;
183 
184  assert(pgroupRef);
185  assert(id);
186 
187  if (!params)
188  {
189  TRACE(TERROR, ("INTERNAL: NULL params"))
190  pgroupRef->len = 0;
191  pgroupRef->ptr.group = 0;
192  *id = 0;
193  next = 0;
194  }
195  else
196  {
197  if (params->generic.indirect)
198  {
199  /* Indirect Reference */
200  object = MHEG5findObject(params->generic.value.o.gref, params->generic.value.o.id);
201  if (object && object->clazz == MHEG5OBJECTREFVARIABLE)
202  {
203  if (((MHEG5ObjectRefVariable *) object)->valueGrp.len != 0)
204  {
205  pgroupRef->len = ((MHEG5ObjectRefVariable *) object)->valueGrp.len;
206  pgroupRef->ptr.name = ((MHEG5ObjectRefVariable *) object)->valueGrp.data;
207  }
208  else
209  {
210  pgroupRef->len = 0;
211  pgroupRef->ptr.group = object->grp;
212  }
213  *id = ((MHEG5ObjectRefVariable *) object)->valueId;
214  }
215  else
216  {
217  pgroupRef->len = 0;
218  pgroupRef->ptr.group = 0;
219  *id = 0;
220  }
221  }
222  else
223  {
224  switch (params->generic.type)
225  {
226  case MHEG5OBJREFEXT:
227  if (params->generic.value.o.gref.len == 0)
228  {
229  /* NULL Object ref - as seen in "3.10.7 Scene 3, CGR Null ref" */
230  pgroupRef->len = 1;
231  pgroupRef->ptr.name = (MHEG5Byte *)dummy_str;
232  break;
233  }
234  case MHEG5OBJECTREF:
235  *pgroupRef = params->generic.value.o.gref;
236  *id = params->generic.value.o.id;
237  break;
238 
239  default:
240  TRACE(TERROR, ("Invalid direct reference %d", params->generic.type));
241  pgroupRef->len = 0;
242  pgroupRef->ptr.group = 0;
243  *id = 0;
244  }
245  }
246  next = params->next;
247  }
248  return next;
249 }
250 
251 /*
252  Resolve final real object from an indirect Objectreference
253  */
255 {
256  MH5GroupRef gref;
257 
258  assert( objref );
259 
260  if (objref->clazz != MHEG5OBJECTREFVARIABLE)
261  {
262  TRACE(TERROR, ("Indirect reference is not ObjRefVariable"))
263  return NULL;
264  }
265 
266  if (((MHEG5ObjectRefVariable *)objref)->valueGrp.len == 0)
267  {
268  TRACE(TERROR, ("ObjRefVariable does not have target group"))
269  return NULL;
270  }
271 
272  gref.len = ((MHEG5ObjectRefVariable *)objref)->valueGrp.len;
273  gref.ptr.name = ((MHEG5ObjectRefVariable *)objref)->valueGrp.data;
274 
275  return MHEG5findObject( gref, ((MHEG5ObjectRefVariable *)objref)->valueId );
276 }
277 
278 /*
279  Resolve Generic Objectreference - can be direct or indirect
280  */
282 {
283  MHEG5GList *next = 0;
284 
285  assert(object);
286  if (!params)
287  return 0;
288  next = MHEG5resolveORef(params, object);
289  if (params->generic.indirect && *object != NULL)
290  {
291  *object = MHEG5resolveRealObject( *object );
292  }
293  return next;
294 }
295 
296 /*
297  Resolve Generic ContentReference - can be direct or indirect
298  */
300  MHEG5Bool *referenced, MHEG5Bool *valid)
301 {
302  MHEG5Root *object = 0;
303  MHEG5GList *next = 0;
304 
305  assert(data);
306  assert(referenced);
307 
308  if (!params)
309  return 0;
310 
311  /* Default values */
312  data->len = 0;
313  data->data = 0;
314  *valid = MHEG5FALSE;
315 
316  if (params->generic.indirect)
317  { /* Indirect Reference */
318  next = MHEG5resolveORef(params, &object);
319  if (object)
320  {
321  if (object->clazz == MHEG5CONTENTREFVARIABLE)
322  {
323  *data = ((MHEG5ContentVariable *) object)->contentData;
324  *referenced = MHEG5TRUE;
325  *valid = MHEG5TRUE;
326  }
327  else if (object->clazz == MHEG5OCTETSTRINGVARIABLE)
328  {
329  /* let's be forgiving and figure that the Mheg app writer wants the string */
330  *data = ((MHEG5OctetStringVariable *) object)->value;
331  *referenced = MHEG5FALSE;
332  *valid = MHEG5TRUE;
333  }
334  }
335  }
336  else
337  {
338  switch (params->generic.type)
339  {
340  case MHEG5OCTETSTRING:
341  *data = params->generic.value.s;
342  *referenced = MHEG5FALSE;
343  *valid = MHEG5TRUE;
344  break;
345 
346  case MHEG5CONTENTREF:
347  *data = params->generic.value.s;
348  *referenced = MHEG5TRUE;
349  *valid = MHEG5TRUE;
350  break;
351 
352  default:
353  /* can it get here ? */
354  break;
355  }
356  next = params->next;
357  }
358  return next;
359 }
360 
361 /*
362  Resolve Generic GenericType - can be direct or indirect
363  */
365 {
366  MHEG5Root *object = 0;
367  MHEG5GList *next = 0;
368  MHEG5ObjectRefVariable *objref;
369 
370  assert(value);
371  if (!params)
372  return 0;
373 
374  /*
375  * initialise isfirst - otherwise later checks using this field in the structure may be undefined
376  */
377  value->isfirst = MHEG5FALSE;
378  value->indirect = MHEG5FALSE;
379  if (params->generic.indirect)
380  { /* Indirect Reference */
381  next = MHEG5resolveORef(params, &object);
382  if (object)
383  {
384  switch (object->clazz)
385  {
387  value->type = MHEG5BOOL;
388  value->value.b = ((MHEG5BooleanVariable *) object)->value;
389  return next;
391  value->type = MHEG5INT;
392  value->value.i = ((MHEG5IntegerVariable *) object)->value;
393  return next;
395  value->type = MHEG5OCTETSTRING;
396  value->value.s = ((MHEG5OctetStringVariable *) object)->value;
397  return next;
399  value->type = MHEG5CONTENTREF;
400  value->value.s = ((MHEG5ContentVariable *) object)->contentData;
401  return next;
403  value->type = MHEG5OBJECTREF;
404  objref = (MHEG5ObjectRefVariable *) object;
405  value->value.o.gref.len = objref->valueGrp.len;
406  value->value.o.gref.ptr.name = objref->valueGrp.data;
407  value->value.o.id = objref->valueId;
408  return next;
409  default:
410  value->type = MHEG5NONE;
411  return next;
412  }
413  }
414  value->type = MHEG5NONE;
415  }
416  else
417  {
418  value->type = params->generic.type;
419  switch (params->generic.type)
420  {
421  case MHEG5BOOL:
422  value->value.b = params->generic.value.b;
423  next = params->next;
424  break;
425  case MHEG5INT:
426  value->value.i = params->generic.value.i;
427  next = params->next;
428  break;
429  case MHEG5OCTETSTRING:
430  value->value.s = params->generic.value.s;
431  next = params->next;
432  break;
433  case MHEG5CONTENTREF:
434  value->value.s = params->generic.value.s;
435  next = params->next;
436  break;
437  case MHEG5OBJREFEXT:
438  value->type = MHEG5OBJECTREF;
439  case MHEG5OBJECTREF:
440  /* direct object reference */
441  next = MHEG5resolveGenericORefProper(params, &value->value.o.gref, &value->value.o.id);
442  break;
443  default:
444  value->type = MHEG5NONE;
445  next = params->next;
446  }
447  }
448  return next;
449 }
450 
451 /*
452  Resolve Generic Boolean - can be direct or indirect
453  */
455 {
456  MHEG5GList *next = 0;
457  MHEG5Generic g;
458 
459  assert(value);
460  next = MHEG5resolveGenericGeneric(params, &g);
461  if (g.type == MHEG5BOOL)
462  *value = g.value.b;
463  return next;
464 }
465 
479  MHEG5String *value,
480  MHEG5Bool *invalidString)
481 {
482  MHEG5GList *next = 0;
483  MHEG5Generic g;
484 
485  assert(value);
486  assert(invalidString);
487 
488  /* Resolve the reference to a generic type */
489  next = MHEG5resolveGenericGeneric(params, &g);
490 
491  if (g.type == MHEG5OCTETSTRING)
492  {
493  /* It's an octet string */
494  *value = g.value.s;
495  *invalidString = MHEG5FALSE;
496  }
497  else
498  {
499  /* It's not an octet string */
500  value->len = 0;
501  value->data = 0;
502  *invalidString = MHEG5TRUE;
503  }
504  return next;
505 }
506 
507 /*
508  Resolve Generic Integer - can be direct or indirect
509  */
511 {
512  MHEG5GList *next = 0;
513  MHEG5Generic g;
514 
515  assert(value);
516  next = MHEG5resolveGenericGeneric(params, &g);
517  if (g.type == MHEG5INT)
518  *value = g.value.i;
519  return next;
520 }
521 
MHEG5GList * MHEG5resolveGenericOctetString(MHEG5GList *params, MHEG5String *value, MHEG5Bool *invalidString)
Resolve a parameter reference to a generic octet string. The reference can be either direct or indire...
Definition: mh5object.c:478
U8BIT indirect
Definition: mh5base.h:149
MH5GroupRef gref
Definition: mh5base.h:110
MHEG5Bool MHEG5sameGroup(MH5GroupPtr gptr, MH5GroupRef gref)
Compares group ptr with group ref to see whether they both reference the same group. The first is pointer to group, the second can be a relative group name and will be converted to absolute prior to the comparison, so two different references that resolve to reference the same group name produces a True return value.
Definition: mh5gate.c:517
U8BIT isfirst
Definition: mh5base.h:150
const char * data
Definition: mh5gate.c:56
MHEG5Int i
Definition: mh5base.h:154
MHEG5String s
Definition: mh5base.h:156
MHEG5ObjectReference o
Definition: mh5base.h:159
U16BIT type
Definition: mh5base.h:151
struct sMHEG5Group * MH5GroupPtr
Definition: mh5base.h:95
Implement the MHEG5 Stream Class Stream Class Defines the behaviour of a composition of continuous me...
MHEG5Final clazz
Definition: mh5root.h:55
MHEG5Bool b
Definition: mh5base.h:155
MHEG5Ingredient * hashIngred[256]
Definition: mh5group.h:64
union sMH5GroupRef::@5 ptr
struct sNvmFile * next
Definition: mh5nvm.c:44
union MHEG5Generic::@6 value
MH5GroupPtr grp
Definition: mh5root.h:57
Implement the MHEG5 Variable Class 21 Variable Class Defines a variable within the context of a Group...
long MHEG5Int
Definition: mh5base.h:73
MHEG5Root * MHEG5resolveRealObject(MHEG5Root *objref)
Definition: mh5object.c:254
This file defines the profile for the MHEG engine.
struct sMHEG5Ingredient * hnxt
Definition: mh5ingredient.h:85
Implement Functions to support Service Gateways. Functions for standarizing several GroupIDs like +DS...
short MHEG5Bool
Definition: mh5base.h:71
MHEG5String MHEG5getGroupId(MHEG5Root *root)
<Function description>="">
Definition: mh5object.c:56
unsigned char MHEG5Byte
Definition: mh5base.h:74
MHEG5GList * MHEG5resolveGenericORefProper(MHEG5GList *params, MH5GroupRef *pgroupRef, MHEG5Int *id)
Resolve a generic object reference, returning the object reference. The reference can be direct or in...
Definition: mh5object.c:177
MHEG5Byte * data
Definition: mh5base.h:85
MHEG5GList * MHEG5resolveGenericGeneric(MHEG5GList *params, MHEG5Generic *value)
Definition: mh5object.c:364
MHEG5GList * MHEG5resolveGenericORef(MHEG5GList *params, MHEG5Root **object)
Definition: mh5object.c:281
MHEG5GList * MHEG5resolveGenericBoolean(MHEG5GList *params, MHEG5Bool *value)
Definition: mh5object.c:454
#define MHEG5TRUE
Definition: mh5base.h:49
Implement functions to retrieve MHEG5objects by GroupID and ID.
Implementation of the MHEG5 Application Class Defines a set of Ingredient objects, which are shared within an application scope. Base class: Group Subclasses: None Status: Concrete class.
Implementation of the MHEG5 Scene Class Scene Class Defines a set of Ingredient objects to be activat...
Mheg5 logging and debug printing.
MHEG5Int len
Definition: mh5base.h:99
MHEG5Byte * name
Definition: mh5base.h:102
MHEG5String groupName
Definition: mh5group.h:53
redirection include
MHEG5Int id
Definition: mh5root.h:48
MHEG5GList * MHEG5resolveGenericCRef(MHEG5GList *params, MHEG5String *data, MHEG5Bool *referenced, MHEG5Bool *valid)
Definition: mh5object.c:299
MHEG5Scene * MHEG5getCurrentScene(void)
<Function description>="">
Definition: mh5scene.c:207
MH5GroupPtr group
Definition: mh5base.h:103
MHEG5Int len
Definition: mh5base.h:84
MHEG5String valueGrp
Definition: mh5variable.h:93
MHEG5GList * MHEG5resolveGenericInteger(MHEG5GList *params, MHEG5Int *value)
Definition: mh5object.c:510
MHEG5Root * MHEG5findObject(MH5GroupRef gref, MHEG5Int id)
Definition: mh5object.c:65
MHEG5Generic generic
Definition: mh5base.h:171
struct sMHEG5GList * next
Definition: mh5base.h:172
MHEG5GList * MHEG5resolveORef(MHEG5GList *params, MHEG5Root **object)
Definition: mh5object.c:126
#define MHEG5FALSE
Definition: mh5base.h:48
MHEG5Application * MHEG5getCurrentApplication(void)
<Function description>="">
#define TRACE(t, x)
Definition: glue_debug.h:118