/* * The Unix Channel * * by Michel Beaudouin-Lafon * * Copyright 1993 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Events, by Stephane Chatty * * $Id$ * $CurLog$ */ #include "Event.h" #include "Channel.h" #include UchEventFeatureList :: UchEventFeatureList (const UchEventFeatureList& base, int nbf, UchEventFeature* f) : CcuListOf (base) { Load (nbf, f); } UchEventFeatureList :: UchEventFeatureList (int nbf, UchEventFeature* f) : CcuListOf () { Load (nbf, f); } void UchEventFeatureList :: Load (int nbf, UchEventFeature* f) { while (nbf-- > 0) Append (f++); } UchEventFeatureList :: ~UchEventFeatureList () { } CcuListOf * UchEventType::AllTypes = 0; void UchEventType :: ClassInit () { AllTypes = new CcuListOf ; } UchEventType :: UchEventType (const char* name, int nbf, UchEventFeature 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; } } UchEventType :: UchEventType (const char* name, const UchEventFeatureList& 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; } } UchEventType :: ~UchEventType () { AllTypes->Remove (this); delete [] FeaturesOffsets; } UchEvent :: UchEvent (const UchEventType* t) : Type (*t) { Data = new char [t->GetTotalSize ()]; } UchEvent :: ~UchEvent () { delete [] Data; } void UchEvent :: SetFeature (int i, const void* data) { int offset = Type.GetOffset (i); int size = Type.GetSize (i); memcpy (Data+offset, data, size); } void UchEvent :: GetFeature (int i, void* data) { int offset = Type.GetOffset (i); int size = Type.GetSize (i); memcpy (data, Data+offset, size); } void UchEvent :: WriteTo (UchIOS& s) { // what about byte swapping? s.WriteBuf ((const byte*) Data, Type.GetTotalSize ()); } void UchEvent :: ReadFrom (UchIOS& s, lword) { // what about byte swapping? s.ReadBuf ((byte*) Data, Type.GetTotalSize ()); }