summaryrefslogtreecommitdiff
path: root/comm/Channel.h
blob: 4a6d5f9a829ff55bfacc6ba566477aaab3ddc317 (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
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
/*
 *	The Unix Channel
 *
 *	by Michel Beaudouin-Lafon
 *
 *	Copyright 1990-1995
 *	Laboratoire de Recherche en Informatique (LRI)
 *
 *	File descriptors, channels
 *
 *	$Id$
 *	$CurLog$
 */

#ifndef Channel_H_
#define Channel_H_

#ifdef __GNUG__
#pragma interface
#endif

#include "cplus_bugs.h"
#include "global.h"
#include "IOS.h"
#include "ccu/SmartPointer.h"

// we need read and write system calls
#include <unistd.h>

class UchMsgBuffer;
class CcuString;

#ifndef NFILE
#define NFILE 20
#endif

enum	IOMODE	{ IONone = 0, IORead = 1, IOWrite = 2,
			  IOReadWrite = 3, IOSelect = 4, IOReadSelect = 5,
			  IOWriteSelect = 6, IOAll = 7 };

extern	char*	StrReprBuf;

class UchFilDes {
private:
static	void	Use (int);
static	void	Unuse (int);

protected:
	int	Fd;
public:
inline		UchFilDes () : Fd (-1)	{ }
inline		UchFilDes (const UchFilDes& fd)	{ Use (Fd = fd.Fd); }
inline		UchFilDes (int fd)			{ Use (Fd = fd); }
inline		~UchFilDes ()			{ Unuse (Fd); }

inline	operator int ()	const			{ return Fd; }
inline	UchFilDes&	operator = (const UchFilDes& fd)	{ Unuse (Fd); Fd = fd.Fd; Use (Fd); return *this; }
inline	int		FilDes ()			{ return Fd; }
inline	void		Open (int fd)		{ Unuse (Fd); Use (Fd = fd); }
inline	void		Close ()			{ Unuse (Fd); Fd = -1; }
inline	bool		Opened ()		{ return bool (Fd >= 0); }
inline	int		Read (byte* b, int n)	{ return read (Fd, (char*) b, n); }
inline	int		Write (byte* b, int n)	{ return write (Fd, (const char*) b, n); }
	char*		StrRepr (char* = StrReprBuf);
};

//	This class defines channels, ie file descriptors with handlers for read/write.
//	The file descriptor of a channel is immutable: once created, it cannot change;
//	this is crucial for channel sets, for instance.
//	However, because Copy and operator= are defined,immutability can be
//	potentially bypassed...
//	UchChannel also derives from CcuSmartData, for building smart pointers
//
class UchChannel;
typedef void (* CH_HANDLER) (UchChannel *);

class UchChannel : public CcuSmartData, public UchIOS {
friend	class	UchBaseMultiplexer;
protected:
	UchFilDes		Fd;
	IOMODE	Mode;
	UchBaseMultiplexer*	Mpx;

virtual	void	Added (UchBaseMultiplexer&);
virtual	void	Removed (UchBaseMultiplexer&);

public:
		UchChannel ();
		UchChannel (int, IOMODE = IOReadWrite);
		UchChannel (const UchChannel& ch);
		~UchChannel ();

inline	void		Open (int fd)	{ if (Fd < 0) Fd.Open (fd); }
inline	IOMODE	IOMode () const			{ return Mode; }
inline	void		SetMode (IOMODE io)		{ Mode = io; }
	int		Read (UchMsgBuffer&);
	int		Write (UchMsgBuffer&);
	bool		ReadBuffer (UchMsgBuffer&);
	bool		WriteBuffer (UchMsgBuffer&);
virtual	UchChannel*	Copy () const;
virtual	void		HandleWrite ();
virtual	void		HandleRead ();
virtual	bool		HandleSelect ();

inline	int		FilDes () const			{ return Fd; }
inline	int		Read (byte* b, int n)	{ return read (Fd, (char*) b, n); }
inline	int		Write (const byte* b, int n)	{ return write (Fd, (const char*) b, n); }
inline			operator int ()		{ return Fd; }
inline	UchBaseMultiplexer*	GetMultiplexer () const	{ return Mpx; }
inline	char*		StrRepr (char* s = StrReprBuf) { return Fd.StrRepr (s); }


virtual	void	WriteLong (lword);
virtual	void	WriteShort (sword);
virtual	void	WriteByte (byte);
virtual	void	WriteChar (char);
virtual	void	WriteString (const char*);
virtual	void	WriteBuf (const byte*, int);

virtual	bool	ReadLong (lword&);
virtual	bool	ReadShort (sword&);
virtual	bool	ReadByte (byte&);
virtual	bool	ReadChar (char&);
virtual	int	ReadString (char*, int);
virtual	int	ReadString (CcuString&);
virtual	bool	ReadBuf (byte*, int);

static	CH_HANDLER	ReadHandler;
static	CH_HANDLER	WriteHandler;
};

PointerClass (pUchChannel, UchChannel)

#endif /* Channel_H_ */