AnnoucementManager should take a Variant reference instead of pointer
[xbmc:xbmc-antiquated.git] / xbmc / lib / libjsonrpc / TCPServer.h
1 #pragma once
2 #ifdef _WIN32
3 #include "WS2tcpip.h"
4 #else
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include <netinet/in.h>
8 #include <arpa/inet.h>
9 #endif
10 #include <string>
11 #include <vector>
12 #include "IAnnouncer.h"
13 #include "ITransportLayer.h"
14 #include "Thread.h"
15 #include "CriticalSection.h"
16
17 class CVariant;
18 namespace JSONRPC
19 {
20   class CTCPServer : public ITransportLayer, public ANNOUNCEMENT::IAnnouncer, public CThread
21   {
22   public:
23     static bool StartServer(int port, bool nonlocal);
24     static void StopServer(bool bWait);
25
26     virtual bool Download(const char *path, Json::Value *result);
27     virtual int GetCapabilities();
28
29     virtual void Announce(ANNOUNCEMENT::EAnnouncementFlag flag, const char *sender, const char *message, const CVariant &data);
30   protected:
31     void Process();
32   private:
33     CTCPServer(int port, bool nonlocal);
34     bool Initialize();
35     void Deinitialize();
36
37     class CTCPClient : public IClient
38     {
39     public:
40       CTCPClient();
41       //Copying a CCriticalSection is not allowed, so copy everything but that
42       //when adding a member variable, make sure to copy it in CTCPClient::Copy
43       CTCPClient(const CTCPClient& client);
44       CTCPClient& operator=(const CTCPClient& client);
45       virtual int  GetPermissionFlags();
46       virtual int  GetAnnouncementFlags();
47       virtual bool SetAnnouncementFlags(int flags);
48       void PushBuffer(CTCPServer *host, const char *buffer, int length);
49       void Disconnect();
50
51       int m_socket;
52       struct sockaddr m_cliaddr;
53       socklen_t m_addrlen;
54       CCriticalSection m_critSection;
55
56     private:
57       void Copy(const CTCPClient& client);
58       int m_announcementflags;
59       int m_beginBrackets, m_endBrackets;
60       std::string m_buffer;
61     };
62
63     std::vector<CTCPClient> m_connections;
64     int m_ServerSocket;
65     int m_port;
66     bool m_nonlocal;
67
68     static CTCPServer *ServerInstance;
69   };
70 }