aboutsummaryrefslogtreecommitdiff
path: root/src/stable/client.h
blob: abe807e4c919328ada3871fe2d3d70f50c71a994 (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
/*
 * Copyright (C) 2007-2019 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/clientbuf.h"
#include "bu/mutex.h"
#include "bu/readwritemutex.h"

#ifndef PROFILE_BU_SERVER
// #define PROFILE_BU_SERVER   1
#endif

#ifdef PROFILE_BU_SERVER
#include "bu/profiler.h"
#endif

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

    /**
     *@ingroup Serving
     */
    class Client : public Bu::Stream
    {
    friend class Server;
    public:
        Client( Bu::ClientLinkFactory *pfLink );
        virtual ~Client();

        void processInput();

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

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

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

        void disconnect();
        bool wantsDisconnect();

        class ClientLink *getLink();

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

        bool hasOutput() { return cbBuffer.server().getSize() > 0; }
        bool hasInput() { return cbBuffer.client().getSize() > 0; }

        template<typename filter>
        void pushFilter()
        {
        }
        
        template<typename filter, typename p1t>
        void pushFilter( p1t p1 )
        {
        }
        
        template<typename filter, typename p1t, typename p2t>
        void pushFilter( p1t p1, p2t p2 )
        {
        }

        /*
         * These are required to qualify as a stream, I dunno how many will
         * be implemented.
         */
        virtual Bu::size tell();
        virtual void seek( Bu::size offset );
        virtual void setPos( Bu::size pos );
        virtual void setPosEnd( Bu::size 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( Bu::size iSize );
        virtual size getSize() const;
        virtual size getBlockSize() const;
        virtual Bu::String getLocation() const;

    private:
        Bu::Protocol *pProto;
        Bu::ClientBuf cbBuffer;
        bool bWantsDisconnect;
        class Bu::ClientLinkFactory *pfLink;
        mutable Bu::Mutex mProto;
        mutable Bu::Mutex mDisconnect;
    };
}

#endif