GVOHub.hpp
7.32 KB
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/***************************************************************************
* GVOHub.hpp - VO SAMP Hub class *
* ----------------------------------------------------------------------- *
* copyright (C) 2014-2015 by Thierry Louge *
* ----------------------------------------------------------------------- *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
***************************************************************************/
/**
* @file GVOHub.hpp
* @brief SAMP hub class interface definition
* @author Thierry Louge
*/
#ifndef GVOHUB_HPP
#define GVOHUB_HPP
/* __ Definitions ________________________________________________________ */
/* __ Includes ___________________________________________________________ */
#include <string>
#include <vector>
#include <sys/socket.h>
#include "GBase.hpp"
#include "GXml.hpp"
#include "GXmlNode.hpp"
/***********************************************************************//**
* @class GVOHub
*
* @brief VO SAMP Hub class
*
* This class implements a SAMP hub for exchanges through VO-compatible
* applications.
***************************************************************************/
class GVOHub : public GBase {
public:
// Constructors and destructors
GVOHub(void);
GVOHub(const GVOHub& hub);
virtual ~GVOHub(void);
// Operators
GVOHub& operator=(const GVOHub& hub);
// Methods
void clear(void);
GVOHub* clone(void) const;
std::string classname(void) const;
void start(void);
std::string print(const GChatter& chatter = NORMAL) const;
protected:
// Protected methods
void init_members(void);
void copy_members(const GVOHub& client);
void free_members(void);
void start_hub(void);
void handle_request(const socklen_t& sock);
void request_ping(const socklen_t& sock);
void request_register(const GXml& xml,
const socklen_t& sock);
void request_unregister(const GXml& xml,
const socklen_t& sock);
void request_declare_metadata(const GXml& xml,
const socklen_t& sock);
void request_declare_subscriptions(const GXml& xml,
const socklen_t& sock);
void request_set_xml_rpc_callback(const GXml& xml,
const socklen_t& sock);
void request_get_subscriptions(const GXml& xml,
const socklen_t& sock);
void request_get_registered_clients(const GXml& xml,
const socklen_t& sock);
void request_get_subscribed_clients(const GXml& xml,
const socklen_t& sock);
void request_get_metadata(const GXml& xml,
const socklen_t& sock);
void request_shutdown(const socklen_t& sock);
std::string get_client_key(const GXml& xml) const;
int get_client_index(const GXml& xml) const;
int get_client_index(const std::string& reference) const;
std::string get_response_value(const GXml& xml,
const std::string& name) const;
void get_name_value_pair(const GXmlNode* node,
std::string& name,
std::string& value) const;
std::vector<std::string> get_subscriptions(const GXml& xml) const;
std::string get_callback_url(const GXml& xml) const;
std::string get_hub_lockfile(void) const;
void send_notifications(const std::string& method,
const std::string& client);
// Low-level methods
void create_samp_file(void) const;
void post_samp_ok(const socklen_t& sock) const;
void post_samp_void(const socklen_t& sock) const;
void post_string(const std::string& content, const socklen_t& sock) const;
void notify(const std::string& url, const std::string& notification) const;
std::string random_string(const size_t& length) const;
// Protected structure
struct client {
std::string name;
std::string private_key;
std::string reference;
std::string description;
std::string icon;
std::string documentation;
std::string affiliation;
std::string author_name;
std::string email;
std::string homepage;
std::string url;
std::vector<std::string> subscriptions;
};
// Protected members
std::string m_secret; //!< Secret Hub key
std::string m_hub_url; //!< The XML-RPC endpoint for communication with the hub
std::string m_hub_host; //!< Hub host
std::string m_hub_port; //!< Hub port
std::string m_hub_path; //!< Hub path
std::string m_version; //!< The version of the SAMP Standard Profile implemented by the hub
std::string m_hub_id; //!< Hub identifier used by the hub when it sends message itself rather than forwarding from others
socklen_t m_socket; //!< Hub socket
bool m_shutdown; //!< Shutdown request
std::vector<client> m_clients; //!< Clients
};
/***********************************************************************//**
* @brief Return class name
*
* @return String containing the class name ("GVOHub").
***************************************************************************/
inline
std::string GVOHub::classname(void) const
{
return ("GVOHub");
}
#endif /* GVOHUB_HPP */