1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/*
* 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 <memory.h>
UchEventFeatureList :: UchEventFeatureList (const UchEventFeatureList& base, int nbf, UchEventFeature* f)
: CcuListOf <UchEventFeature> (base)
{
Load (nbf, f);
}
UchEventFeatureList :: UchEventFeatureList (int nbf, UchEventFeature* f)
: CcuListOf <UchEventFeature> ()
{
Load (nbf, f);
}
void
UchEventFeatureList :: Load (int nbf, UchEventFeature* f)
{
while (nbf-- > 0)
Append (f++);
}
UchEventFeatureList :: ~UchEventFeatureList ()
{
}
CcuListOf <UchEventType>* UchEventType::AllTypes = 0;
void
UchEventType :: ClassInit ()
{
AllTypes = new CcuListOf <UchEventType>;
}
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 <UchEventFeature> 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 ());
}
|