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
|
/*
Kopete Groupwise Protocol
eventprotocol.h - reads the protocol used by GroupWise for signalling Events
Copyright (c) 2004 SUSE Linux AG http://www.suse.com
Kopete (c) 2002-2004 by the Kopete developers <[email protected]>
*************************************************************************
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
*************************************************************************
*/
#ifndef GW_EVENTPROTOCOL_H
#define GW_EVENTPROTOCOL_H
#include "inputprotocolbase.h"
class EventTransfer;
/**
* This class converts incoming event data into EventTransfer objects. Since it requires knowledge of the binary event format, which
* differs for each event type, it is implemented as a separate class. See also @ref CoreProtocol, which detects event messages in the
* data stream and hands them to this class for processing.
* Event Types
*
@author SUSE AG
Ablauf:
CoreProtocol receives data in addIncomingData, and passes to wireToTransfer.
wireToTransfer detects an event.
Passes whole chunk to EventProtocol ( as QByteArray )
In to EventProtocol - QByteArray
Returned from EventProtocol - EventTransfer *, bytes read, set state?
EventProtocol tries to parse data into eventTransfer
If not complete, sets state to NeedMore and returns 0
If complete, returns number of bytes read for the event
If bytes less than length of chunk, CoreProtocol::addIncomingData places the unread bytes back in m_in and calls wireToTransfer again.
if ResponseProtocol or EventProtocol set state to NeedMore, don't call wireToTransfer again.
What event dependent data does EventTransfer contain?
What if some events contain EXTRA bytes off the end that we don't know about? Then we will put those bytes back on the buffer, and try and parse those as the start of a new message!!! Need to react SAFELY then.
What event dependent binary data does each event type contain?
All Events contain an event code, and a source ( a DN )
NOTHANDLED indicates that there is no further data and we don't handle events of that type, because they are not sent by the server
NONE indicates there is no further data
STATUSTEXT, GUID, MESSAGE indicate a string encoded in the usual GroupWise binary string encoding: a UINT32 containing the string length in little-endian, followed by the string itself, as UTF-8 encoded unicode. The string length value includes a terminating NUL, so when converting to a QString, subtract one from the string length.
FLAGS contains a UINT32 containing the server's flags for this conference. See gwerror.h for the possible values and meanings of these flags. Only Logging has been observed in practice.
All events are timestamped with the local time on receipt.
From gwerror.h:
enum Event { InvalidRecipient = 101,
NOTHANDLED
UndeliverableStatus = 102,
NOTHANDLED *
StatusChange = 103,
Q_UINT16 STATUS
STATUSTEXT
ContactAdd = 104,
NOTHANDLED
ConferenceClosed = 105,
GUID
ConferenceJoined = 106,
GUID
FLAGS
ConferenceLeft = 107,
GUID
FLAGS
ReceiveMessage = 108,
GUID
FLAGS
MESSAGE
ReceiveFile = 109,
NOTHANDLED
UserTyping = 112,
GUID
UserNotTyping = 113,
GUID
UserDisconnect = 114,
NONE
ServerDisconnect = 115,
NONE
ConferenceRename = 116,
NOTHANDLED
ConferenceInvite = 117,
GUID
MESSAGE
ConferenceInviteNotify = 118,
GUID
ConferenceReject = 119,
GUID
ReceiveAutoReply = 121,
GUID
FLAGS
MESSAGE
Start = InvalidRecipient,
Stop = ReceiveAutoReply
};
Therefore we have GUID, FLAGS, MESSAGE, STATUS, STATUSTEXT. All transfers have TYPE and SOURCE, and a TIMESTAMP is added on receipt.
*/
class EventProtocol : public InputProtocolBase
{
Q_OBJECT
public:
EventProtocol(QObject *parent = 0, const char *name = 0);
~EventProtocol();
/**
* Attempt to parse the supplied data into an @ref EventTransfer object.
* The exact state of the parse attempt can be read using @ref state.
* @param rawData The unparsed data.
* @param bytes An integer used to return the number of bytes read.
* @return A pointer to an EventTransfer object if successfull, otherwise 0. The caller is responsible for deleting this object.
*/
Transfer * parse( const QByteArray &, uint & bytes );
protected:
/**
* Reads a conference's flags
*/
bool readFlags( Q_UINT32 &flags);
};
#endif
|