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
|
/*
* The Unix Channel
*
* by Michel Beaudouin-Lafon
*
* Copyright 1990-1993
* Laboratoire de Recherche en Informatique (LRI)
*
* Text streams
*
* $Id$
* $CurLog$
*/
#ifndef TextStream_H_
#define TextStream_H_
#include "cplus_bugs.h"
#include "Stream.h"
#include "MsgBuffer.h"
#include "MsgStream.h"
#include "ccu/String.h"
class UchTextLine;
class UchTextStream : public UchBufStream {
public:
enum cmd_res {
isCmdSyntax, // syntax error when parsing command
isCmdUnknown, // unknown command
isCmdOk, // request executed
isCmdError, // problem while executing request
isCmdClose, // close connection
isCmdQuit, // quit server
isCmdTerminate, // terminate multiplexer
isCmdAbort, // abort multiplexer
isCmdExit // call exit
};
protected:
void Closing (bool);
void HandleRead ();
void Process (UchMsgBuffer&);
void Flush ();
void ProcessCmdResult (cmd_res, const UchTextLine&);
cmd_res TryPredefined (const UchTextLine&);
virtual cmd_res Execute (const UchTextLine&) = 0;
void WriteLong (lword);
void WriteShort (sword);
void WriteByte (byte);
void WriteChar (char);
void WriteString (const char*);
bool ReadLong (lword&);
bool ReadShort (sword&);
bool ReadByte (byte&);
bool ReadChar (char&);
int ReadString (char*, int);
int ReadString (CcuString&);
public:
UchTextStream (UchAddress* = 0, UchAddress* = 0);
~UchTextStream ();
// UchTextStream (const UchTextStream&);
// UchChannel* Copy () const;
virtual void Close (); // 'close' request
virtual void Quit (); // 'quit' request
void Send (const char*, bool = false);
void Send (const UchTextLine&, bool = false);
};
class UchTextWord {
protected:
const char* Sval;
int Ival;
public:
inline UchTextWord () : Sval (0), Ival (0) {}
inline UchTextWord (const char* s) { SetVal (s); }
inline UchTextWord (int i) { SetVal (i); }
void SetVal (const char*);
inline void SetVal (int i) { Sval = 0; Ival = i; }
inline bool IsInt () const { return (Sval == 0) ? true : false; }
inline bool IsString () const { return (Sval != 0) ? true : false; }
const char* GetQuotes () const;
inline operator int () const { return Ival; }
inline operator const char* () const { return Sval; }
};
class UchTextLine {
protected:
int Num;
int Max;
UchTextWord* Words;
void NewWord (const char* s, int i);
public:
UchTextLine ();
~UchTextLine ();
inline UchTextWord& operator [] (int i) const { return Words [i]; }
inline int NumWords () const { return Num; }
inline void AddWord (const char* s) { NewWord (s, 0); }
inline void AddWord (int i) { NewWord (0, i); }
void AddTrailer (const UchTextLine&, int);
inline UchTextLine& operator << (int i) { AddWord (i); return *this; }
inline UchTextLine& operator << (const char* s) { AddWord (s); return *this; }
inline UchTextLine& operator << (const UchTextLine& l) { AddTrailer (l, 0); return *this; }
bool Parse (char*);
char* Unparse (char* dest, int len) const;
char* Unparse (UchMsgBuffer*) const;
bool Match (const char*, const char* = 0) const;
int Index (const char*) const;
int Index (int) const;
inline bool Contains (const char* w) const { return (Index (w) == -1) ? false : true; }
inline bool Contains (int i) const { return (Index (i) == -1) ? false : true; }
inline void Reset () { Num = 0; }
};
#endif /* TextStream_H_ */
|