summaryrefslogtreecommitdiff
path: root/comm/Message.cc
blob: c116c5114dd5edc235e3bca968192450fe04edd8 (plain)
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
/*
 *	The Unix Channel
 *
 *	by Michel Beaudouin-Lafon
 *
 *	Copyright 1990-1993
 *	Laboratoire de Recherche en Informatique (LRI)
 *
 *	Messages
 *
 *	$Id$
 *	$CurLog$
 */

#include "cplus_bugs.h"

#include "Message.h"

/*?class UchMessage
\typ{UchMessage} is the abstract base class for messages.
Each subclass must redefine the virtual functions \fun{WriteTo} and \fun{ReadFrom},
so that messages can be added to and retrieved from buffers.
?*/

/*?nodoc?*/
UchMessage :: UchMessage ()
{
}

/*?nodoc?*/
UchMessage :: ~UchMessage ()
{
}

/*?
This virtual function must write a message into a buffer.
Usually, the implementation of this function in a derived class starts by calling
the same function of its base class, because a derived class inherits the fields
of its base class and adds its own fields.
Data is usually appended to the buffer by the \fun{UchMsgBuffer::Append}
functions or \fun{operator $<<$}.
The default implementation does nothing.
?*/
void
UchMessage :: WriteTo (UchMsgBuffer&)
{
	// nothing
}

/*?
This virtual function must extract data from the buffer to create the message.
At most \var{len} bytes should be read from the buffer.
Usually, the implementation of this function in a derived class starts by calling
the same function of its base class, because a derived class inherits the fields
of its base class and adds its own fields.
Data is usually retrieved from the buffer by the \fun{UchMsgBuffer::Get}
functions or \fun{operator $>>$}.
The default implementation does nothing.
?*/
void
UchMessage :: ReadFrom (UchMsgBuffer&, lword)
{
}

/*?
This virtual function can be redefined in derived classes to support the handling of messages
after they have been loaded from a buffer. The function \typ{MyClient}::\fun{NewMessage}
may then look like:
\begin{ccode}
void
MyClient :: NewMessage (UchMsgBuffer& buffer, bool ask)
{
    MyRequest* m = 0;
    lword type;
    buffer.MsgPeek (&type);
    switch (type) {
    case MyFirstReqType:
        m = new MyFirstRequest;
        break;
    case ...
       ...
    }
    if (m) {
        buffer.Get (m);
        m->Activate (*this);
        return TRUE;
    }
    return FALSE;
}
\end{ccode}
However, this virtual function is only provided as a facility and is not used
by \uch. Redefining it is not mandatory.
?*/
void
UchMessage :: Activate (UchMsgStream&)
{
}