GVOHub.hpp
8.17 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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/***************************************************************************
* GVOHub.hpp - VO SAMP Hub class *
* ----------------------------------------------------------------------- *
* copyright (C) 2014-2016 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"
/* __ Forward declarations _______________________________________________ */
class GXml;
class GXmlNode;
/***********************************************************************//**
* @class GVOHub
*
* @brief VO SAMP Hub class
*
* This class implements a SAMP hub to support the interoperability of
* Virtual Observatory 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_notify_all(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 GXmlNode* node,
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;
std::string get_mtype(const GXml& xml) const;
// Client 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;
};
// Low-level methods
void create_samp_file(void) const;
void delete_samp_file(void) const;
int get_socket(void);
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;
void notify_register(const client& client,
const std::string& reference);
void notify_unregister(const client& client,
const std::string& reference);
void notify_metadata(const client& client,
const std::string& reference);
void notify_image_load(const client& client,
const GXml& xml);
void notify_table_load(const GVOHub::client& client,
const GXml& xml);
std::string random_string(const size_t& length) const;
std::string hub_url(void) const;
// Protected members
std::string m_secret; //!< Secret Hub key
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
int 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 */