/* * DNN - Data News Network * * by Stephane Chatty * * Copyright 1993-1995 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Events. * * $Id$ * $CurLog$ */ #include "Event.h" #include DnnEventFeatureList :: DnnEventFeatureList (const DnnEventFeatureList& base, int nbf, DnnEventFeature* f) : CcuListOf (base) { Load (nbf, f); } DnnEventFeatureList :: DnnEventFeatureList (int nbf, DnnEventFeature* f) : CcuListOf () { Load (nbf, f); } void DnnEventFeatureList :: Load (int nbf, DnnEventFeature* f) { while (nbf-- > 0) Append (f++); } DnnEventFeatureList :: ~DnnEventFeatureList () { } /*?class DnnEventType A \typ{DnnEventType} contains the description of a -- dynamic -- class of events. It holds a name and an array of offsets, each describing where to find the corresponding feature in an event of that class. ?*/ CcuListOf * DnnEventType::AllTypes = 0; /*?hidden?*/ void DnnEventType :: ClassInit () { AllTypes = new CcuListOf ; } /*? Build an event type named \var{name} from an array of features. This is mostly useful for statically defined event classes. \var{f} is the array of features, and \var{nbf} is the number of features in that array. ?*/ DnnEventType :: DnnEventType (const char* name, int nbf, DnnEventFeature f []) : Name (name), #if 0 Features (), #endif NbFeatures (nbf), FeaturesOffsets (new int [nbf]) { if (!AllTypes) ClassInit (); AllTypes->Append (this); int offset = 0; for (int i = 0; i < nbf; ++i) { offset += f[i].Size; FeaturesOffsets [i] = offset; } } /*? Build an event type from a list of features. ?*/ DnnEventType :: DnnEventType (const char* name, const DnnEventFeatureList& fl) : Name (name), #if 0 Features (), #endif NbFeatures (fl.Length ()), FeaturesOffsets (new int [NbFeatures]) { if (!AllTypes) ClassInit (); AllTypes->Append (this); int offset = 0; int i = 0; CcuListIterOf f = fl; while (++f) { offset += (*f)->Size; FeaturesOffsets [i] = offset; ++i; } } /*?nodoc?*/ DnnEventType :: ~DnnEventType () { AllTypes->Remove (this); delete [] FeaturesOffsets; } /*? Build an event of type \var{t}. ?*/ DnnEvent :: DnnEvent (const DnnEventType* t) : Type (*t) { int sz = t->GetTotalSize (); if (sz > 0) Data = new char [sz]; else Data = 0; } DnnEvent :: DnnEvent (const DnnEventType* t, bool alloc) : Type (*t) { if (alloc) { int sz = t->GetTotalSize (); if (sz > 0) Data = new char [sz]; else Data = 0; } else { Data = (char*) (&Data + sizeof (char*)); } } /*?nodoc?*/ DnnEvent :: ~DnnEvent () { if (Data && Data != (char*) (&Data+sizeof (char*))) delete [] Data; } void DnnEvent :: SetFeature (int i, const void* data) { int offset = Type.GetOffset (i); int size = Type.GetSize (i); memcpy (Data+offset, data, size); } void DnnEvent :: GetFeature (int i, void* data) { int offset = Type.GetOffset (i); int size = Type.GetSize (i); memcpy (data, Data+offset, size); } #if 0 void DnnEvent :: WriteTo (DnnIOS& s) { // what about byte swapping? s.WriteBuf ((const byte*) Data, Type.GetTotalSize ()); } void DnnEvent :: ReadFrom (DnnIOS& s, lword) { // what about byte swapping? s.ReadBuf ((byte*) Data, Type.GetTotalSize ()); } #endif