summaryrefslogtreecommitdiff
path: root/src/client.h
blob: 871acadee228ea98bc48c3c39f56a6af2ead804a (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
/*
 * Copyright (C) 2007-2010 Xagasoft, All rights reserved.
 *
 * This file is part of the libbu++ library and is released under the
 * terms of the license contained in the file LICENSE.
 */

#ifndef BU_CLIENT_H
#define BU_CLIENT_H

#include <stdint.h>

#include "bu/config.h"
#include "bu/string.h"
#include "bu/queuebuf.h"

namespace Bu
{
	class Protocol;
	class Stream;
	class TcpSocket;
	class ClientLinkFactory;

	/**
	 *@ingroup Serving
	 */
	class Client : public Bu::Stream
	{
	public:
		Client( Bu::TcpSocket *pSocket, Bu::ClientLinkFactory *pfLink );
		virtual ~Client();

		void processInput();
		void processOutput();

		//Bu::String &getInput();
		//Bu::String &getOutput();
		size_t write( const Bu::String &sData );
		size_t write( const void *pData, size_t nBytes );
		size_t write( int8_t nData );
		size_t write( int16_t nData );
		size_t write( int32_t nData );
		size_t write( int64_t nData );
		size_t write( uint8_t nData );
		size_t write( uint16_t nData );
		size_t write( uint32_t nData );
		size_t write( uint64_t nData );
		size_t read( void *pData, size_t nBytes );
		size_t peek( void *pData, int nBytes, int nOffset=0 );
//		void seek( int nBytes );
		long getInputSize();
		long getOutputSize();

		void setProtocol( Protocol *pProto );
		Bu::Protocol *getProtocol();
		void clearProtocol();

		bool isOpen();
		void close();
		void tick();

		const Bu::TcpSocket *getSocket() const;

		void disconnect();
		bool wantsDisconnect();

		class ClientLink *getLink();

		void onMessage( const Bu::String &sMsg );

		bool hasOutput() { return qbWrite.getSize() > 0; }
		bool hasInput() { return qbRead.getSize() > 0; }

		template<typename filter>
		void pushFilter()
		{
			filter *pFlt = new filter( *pTopStream );
			pTopStream = pFlt;
			lFilts.prepend( pFlt );
		}
		
		template<typename filter, typename p1t>
		void pushFilter( p1t p1 )
		{
			filter *pFlt = new filter( *pTopStream, p1 );
			pTopStream = pFlt;
			lFilts.prepend( pFlt );
		}
		
		template<typename filter, typename p1t, typename p2t>
		void pushFilter( p1t p1, p2t p2 )
		{
			filter *pFlt = new filter( *pTopStream, p1, p2 );
			pTopStream = pFlt;
			lFilts.prepend( pFlt );
		}

		/*
		 * These are required to qualify as a stream, I dunno how many will
		 * be implemented.
		 */
		virtual long tell();
		virtual void seek( long offset );
		virtual void setPos( long pos );
		virtual void setPosEnd( long pos );
		virtual bool isEos();
		virtual void flush();
		virtual bool canRead();
		virtual bool canWrite();
		virtual bool isReadable();
		virtual bool isWritable();
		virtual bool isSeekable();
		virtual bool isBlocking();
		virtual void setBlocking( bool bBlocking=true );
		virtual void setSize( long iSize );

	private:
		typedef Bu::List<Bu::Stream *> FilterList;
		FilterList lFilts;
		Bu::Stream *pTopStream;
		Bu::TcpSocket *pSocket;
		Bu::Protocol *pProto;
		Bu::QueueBuf qbRead;
		Bu::QueueBuf qbWrite;
		bool bWantsDisconnect;
		class Bu::ClientLinkFactory *pfLink;
	};
}

#endif