Commit 912684d70b279369173ae594c9c94abc78e76114
1 parent
5733c3a3
Afetr debug of fully SAMP compliant Hub
Showing
4 changed files
with
406 additions
and
136 deletions
.plastic
0 → 100644
include/GVOHub.hpp
| @@ -28,11 +28,13 @@ | @@ -28,11 +28,13 @@ | ||
| 28 | #define GVOHUB_HPP | 28 | #define GVOHUB_HPP |
| 29 | #define GVOHUB_NB_CLIENTS 5 | 29 | #define GVOHUB_NB_CLIENTS 5 |
| 30 | #define GVOHUB_NB_METHODS 128 | 30 | #define GVOHUB_NB_METHODS 128 |
| 31 | +#define GVO_HUB_testing 1 | ||
| 31 | 32 | ||
| 32 | /* __ Includes ___________________________________________________________ */ | 33 | /* __ Includes ___________________________________________________________ */ |
| 33 | #include <string> | 34 | #include <string> |
| 34 | #include <list> | 35 | #include <list> |
| 35 | #include <sys/socket.h> | 36 | #include <sys/socket.h> |
| 37 | +#include <semaphore.h> | ||
| 36 | #include "GBase.hpp" | 38 | #include "GBase.hpp" |
| 37 | #include "GXml.hpp" | 39 | #include "GXml.hpp" |
| 38 | #include "GXmlNode.hpp" | 40 | #include "GXmlNode.hpp" |
| @@ -61,7 +63,6 @@ public: | @@ -61,7 +63,6 @@ public: | ||
| 61 | // Methods | 63 | // Methods |
| 62 | void clear(void); | 64 | void clear(void); |
| 63 | GVOHub* clone(void) const; | 65 | GVOHub* clone(void) const; |
| 64 | - void start(void); | ||
| 65 | std::string print(const GChatter& chatter = NORMAL) const; | 66 | std::string print(const GChatter& chatter = NORMAL) const; |
| 66 | 67 | ||
| 67 | 68 | ||
| @@ -70,7 +71,7 @@ protected: | @@ -70,7 +71,7 @@ protected: | ||
| 70 | void init_members(void); | 71 | void init_members(void); |
| 71 | void copy_members(const GVOHub& client); | 72 | void copy_members(const GVOHub& client); |
| 72 | void free_members(void); | 73 | void free_members(void); |
| 73 | - void init_hub(void); | 74 | + void create_samp_file(void); |
| 74 | void start_hub(void); | 75 | void start_hub(void); |
| 75 | void register_service(const GXml& xml,const socklen_t& sock); | 76 | void register_service(const GXml& xml,const socklen_t& sock); |
| 76 | void ping_service(const socklen_t& sock); | 77 | void ping_service(const socklen_t& sock); |
| @@ -102,7 +103,8 @@ protected: | @@ -102,7 +103,8 @@ protected: | ||
| 102 | std::string& value) const; | 103 | std::string& value) const; |
| 103 | std::string get_hub_lockfile(void) const; | 104 | std::string get_hub_lockfile(void) const; |
| 104 | std::string random_string( size_t length ); | 105 | std::string random_string( size_t length ); |
| 105 | - void intHandler(int sig); | 106 | + void activate_callbacks(std::string method,char cl_id[31]); |
| 107 | + void post_string_toclient(const std::string& content) const; | ||
| 106 | 108 | ||
| 107 | // Protected members | 109 | // Protected members |
| 108 | std::string m_name; //!< Client name | 110 | std::string m_name; //!< Client name |
| @@ -114,33 +116,32 @@ protected: | @@ -114,33 +116,32 @@ protected: | ||
| 114 | std::string m_client_key; //!< Private client key | 116 | std::string m_client_key; //!< Private client key |
| 115 | std::string m_hub_id; //!< Hub identifier used by the hub when it sends message itself rather than forwarding from others | 117 | std::string m_hub_id; //!< Hub identifier used by the hub when it sends message itself rather than forwarding from others |
| 116 | int m_socket; //!< Hub socket | 118 | int m_socket; //!< Hub socket |
| 119 | + int cback_socket; //!< Hub socket to callback clients | ||
| 117 | int m_nb_clients; //!< Number of already registered clients | 120 | int m_nb_clients; //!< Number of already registered clients |
| 118 | typedef struct { | 121 | typedef struct { |
| 119 | char private_key[16]; | 122 | char private_key[16]; |
| 120 | char name[32]; | 123 | char name[32]; |
| 121 | char reference[32]; | 124 | char reference[32]; |
| 122 | - char description[32]; | 125 | + char description[256]; |
| 123 | char icon[32]; | 126 | char icon[32]; |
| 124 | char documentation[32]; | 127 | char documentation[32]; |
| 125 | char affiliation[32]; | 128 | char affiliation[32]; |
| 126 | char author_name[32]; | 129 | char author_name[32]; |
| 127 | char email[32]; | 130 | char email[32]; |
| 128 | char homepage[32]; | 131 | char homepage[32]; |
| 129 | - char port[16]; | ||
| 130 | - char registered_methods[GVOHUB_NB_METHODS][128]; //128 methods of 128 cars max. | 132 | + char port[32]; |
| 133 | + char registered_methods[GVOHUB_NB_METHODS][GVOHUB_NB_METHODS]; //128 methods of 128 cars max. | ||
| 131 | } connected_shm; | 134 | } connected_shm; |
| 132 | typedef struct { | 135 | typedef struct { |
| 133 | int registered; | 136 | int registered; |
| 137 | + sem_t lock; | ||
| 134 | connected_shm metadatas[GVOHUB_NB_CLIENTS]; | 138 | connected_shm metadatas[GVOHUB_NB_CLIENTS]; |
| 135 | } clients_descriptor; | 139 | } clients_descriptor; |
| 136 | clients_descriptor *reg_clients; | 140 | clients_descriptor *reg_clients; |
| 137 | connected_shm *clients; | 141 | connected_shm *clients; |
| 138 | void* ptr_mem_partagee; //pointer to shm address | 142 | void* ptr_mem_partagee; //pointer to shm address |
| 139 | int shm_handler; //handler to shm | 143 | int shm_handler; //handler to shm |
| 140 | - static std::vector<GVOApp>& connected() { | ||
| 141 | - static std::vector<GVOApp> m_connected_apps; //!< list of apps connected to the hub | ||
| 142 | - return m_connected_apps; | ||
| 143 | - } | 144 | + |
| 144 | }; | 145 | }; |
| 145 | 146 | ||
| 146 | #endif /* GVOHUB_HPP */ | 147 | #endif /* GVOHUB_HPP */ |
pyext/GVOHub.i
src/vo/GVOHub.cpp
| @@ -47,9 +47,11 @@ | @@ -47,9 +47,11 @@ | ||
| 47 | #include <sys/ipc.h> | 47 | #include <sys/ipc.h> |
| 48 | #include <sys/shm.h> | 48 | #include <sys/shm.h> |
| 49 | 49 | ||
| 50 | + | ||
| 50 | /* __ Method name definitions ____________________________________________ */ | 51 | /* __ Method name definitions ____________________________________________ */ |
| 51 | #define G_HANDLE_REQUEST "GVOHub::handle_request(socklen_t)" | 52 | #define G_HANDLE_REQUEST "GVOHub::handle_request(socklen_t)" |
| 52 | #define G_START_HUB "GVOHub::start_hub()" | 53 | #define G_START_HUB "GVOHub::start_hub()" |
| 54 | +#define G_INIT_MEMBERS "GVOHub::init_members()" | ||
| 53 | 55 | ||
| 54 | /* __ Macros _____________________________________________________________ */ | 56 | /* __ Macros _____________________________________________________________ */ |
| 55 | 57 | ||
| @@ -101,7 +103,7 @@ GVOHub::GVOHub(const GVOHub& hub) | @@ -101,7 +103,7 @@ GVOHub::GVOHub(const GVOHub& hub) | ||
| 101 | ***************************************************************************/ | 103 | ***************************************************************************/ |
| 102 | GVOHub::~GVOHub(void) | 104 | GVOHub::~GVOHub(void) |
| 103 | { | 105 | { |
| 104 | - | 106 | + free_members(); |
| 105 | // Return | 107 | // Return |
| 106 | return; | 108 | return; |
| 107 | } | 109 | } |
| @@ -173,24 +175,6 @@ GVOHub* GVOHub::clone(void) const | @@ -173,24 +175,6 @@ GVOHub* GVOHub::clone(void) const | ||
| 173 | 175 | ||
| 174 | 176 | ||
| 175 | /***********************************************************************//** | 177 | /***********************************************************************//** |
| 176 | - * @brief Start Hub | ||
| 177 | - ***************************************************************************/ | ||
| 178 | -void GVOHub::start(void) | ||
| 179 | -{ | ||
| 180 | - // Creates Hub | ||
| 181 | - printf("Creating the hub\n"); | ||
| 182 | - init_hub(); | ||
| 183 | - | ||
| 184 | - // Starts the hub | ||
| 185 | - printf("Starting the hub\n"); | ||
| 186 | - start_hub(); | ||
| 187 | - | ||
| 188 | - // Return | ||
| 189 | - return; | ||
| 190 | -} | ||
| 191 | - | ||
| 192 | - | ||
| 193 | -/***********************************************************************//** | ||
| 194 | * @brief | 178 | * @brief |
| 195 | * | 179 | * |
| 196 | * | 180 | * |
| @@ -226,7 +210,7 @@ void GVOHub::register_service(const GXml& xml, const socklen_t& sock) | @@ -226,7 +210,7 @@ void GVOHub::register_service(const GXml& xml, const socklen_t& sock) | ||
| 226 | { | 210 | { |
| 227 | 211 | ||
| 228 | printf("Registration request called\n"); | 212 | printf("Registration request called\n"); |
| 229 | - | 213 | + //sem_wait(®_clients->lock); |
| 230 | // Declare message | 214 | // Declare message |
| 231 | std::string msg = ""; | 215 | std::string msg = ""; |
| 232 | char selfid[124]; | 216 | char selfid[124]; |
| @@ -248,7 +232,7 @@ void GVOHub::register_service(const GXml& xml, const socklen_t& sock) | @@ -248,7 +232,7 @@ void GVOHub::register_service(const GXml& xml, const socklen_t& sock) | ||
| 248 | } | 232 | } |
| 249 | } | 233 | } |
| 250 | 234 | ||
| 251 | - printf("Message composition 2 \n"); | 235 | + //printf("Message composition 2 \n"); |
| 252 | sprintf(selfid,"\t\t\t\t\t<member><name>samp.self-id</name><value>%s</value></member>\n",cl_id); | 236 | sprintf(selfid,"\t\t\t\t\t<member><name>samp.self-id</name><value>%s</value></member>\n",cl_id); |
| 253 | sprintf(privatekey,"\t\t\t\t\t<member><name>samp.private-key</name><value>%s</value></member>\n",secret.c_str()); | 237 | sprintf(privatekey,"\t\t\t\t\t<member><name>samp.private-key</name><value>%s</value></member>\n",secret.c_str()); |
| 254 | reg_clients->registered ++; | 238 | reg_clients->registered ++; |
| @@ -269,6 +253,8 @@ void GVOHub::register_service(const GXml& xml, const socklen_t& sock) | @@ -269,6 +253,8 @@ void GVOHub::register_service(const GXml& xml, const socklen_t& sock) | ||
| 269 | msg.append("</methodResponse>\n"); | 253 | msg.append("</methodResponse>\n"); |
| 270 | post_string(msg,sock); | 254 | post_string(msg,sock); |
| 271 | 255 | ||
| 256 | + activate_callbacks("samp.hub.event.register",cl_id); | ||
| 257 | + //sem_post(®_clients->lock); | ||
| 272 | //Return | 258 | //Return |
| 273 | return; | 259 | return; |
| 274 | } | 260 | } |
| @@ -281,7 +267,7 @@ void GVOHub::register_service(const GXml& xml, const socklen_t& sock) | @@ -281,7 +267,7 @@ void GVOHub::register_service(const GXml& xml, const socklen_t& sock) | ||
| 281 | ***************************************************************************/ | 267 | ***************************************************************************/ |
| 282 | void GVOHub::unregister(const GXml& xml,const socklen_t& sock) | 268 | void GVOHub::unregister(const GXml& xml,const socklen_t& sock) |
| 283 | { | 269 | { |
| 284 | - | 270 | + //sem_wait(®_clients->lock); |
| 285 | std::string client_calling = ""; | 271 | std::string client_calling = ""; |
| 286 | const GXmlNode* node = xml.element("methodCall", 0); | 272 | const GXmlNode* node = xml.element("methodCall", 0); |
| 287 | node = node->element("params", 0); | 273 | node = node->element("params", 0); |
| @@ -297,31 +283,33 @@ void GVOHub::unregister(const GXml& xml,const socklen_t& sock) | @@ -297,31 +283,33 @@ void GVOHub::unregister(const GXml& xml,const socklen_t& sock) | ||
| 297 | printf("Client %s matching candidate:\n",reg_clients->metadatas[i].private_key); | 283 | printf("Client %s matching candidate:\n",reg_clients->metadatas[i].private_key); |
| 298 | if (strcmp(reg_clients->metadatas[i].private_key,client_calling.c_str()) == 0) { | 284 | if (strcmp(reg_clients->metadatas[i].private_key,client_calling.c_str()) == 0) { |
| 299 | printf("Client %s unregistration:\n",reg_clients->metadatas[i].reference); | 285 | printf("Client %s unregistration:\n",reg_clients->metadatas[i].reference); |
| 300 | - strcpy(reg_clients->metadatas[i].reference,"NoRef"); | ||
| 301 | - sprintf(reg_clients->metadatas[i].name,"NoName"); | ||
| 302 | - sprintf(reg_clients->metadatas[i].description,"NoDescription"); | ||
| 303 | - sprintf(reg_clients->metadatas[i].icon,"NoIcon"); | ||
| 304 | - sprintf(reg_clients->metadatas[i].documentation,"NoDoc"); | ||
| 305 | - sprintf(reg_clients->metadatas[i].affiliation,"NoAffiliation"); | ||
| 306 | - sprintf(reg_clients->metadatas[i].email,"NoMail"); | ||
| 307 | - sprintf(reg_clients->metadatas[i].author_name,"NoAuthor"); | ||
| 308 | - sprintf(reg_clients->metadatas[i].homepage,"NoPage"); | ||
| 309 | 286 | ||
| 310 | 287 | ||
| 288 | + | ||
| 289 | + // Declare message | ||
| 290 | + std::string msg = ""; | ||
| 291 | + | ||
| 292 | + // Set methodResponse elts | ||
| 293 | + msg.append("<?xml version=\"1.0\"?>\n"); | ||
| 294 | + msg.append("<methodResponse>\n"); | ||
| 295 | + msg.append("\t<params>\n"); | ||
| 296 | + msg.append("\t\t<param>\n\t\t\t<value/>\n\t\t</param>\n"); | ||
| 297 | + msg.append("\t</params>\n"); | ||
| 298 | + msg.append("</methodResponse>\n"); | ||
| 299 | + post_string(msg,sock); | ||
| 300 | + activate_callbacks("samp.hub.event.unregister",reg_clients->metadatas[i].reference); | ||
| 301 | + strcpy(reg_clients->metadatas[i].reference,"NoRef"); | ||
| 302 | + sprintf(reg_clients->metadatas[i].name,"NoName"); | ||
| 303 | + sprintf(reg_clients->metadatas[i].description,"NoDescription"); | ||
| 304 | + sprintf(reg_clients->metadatas[i].icon,"NoIcon"); | ||
| 305 | + sprintf(reg_clients->metadatas[i].documentation,"NoDoc"); | ||
| 306 | + sprintf(reg_clients->metadatas[i].affiliation,"NoAffiliation"); | ||
| 307 | + sprintf(reg_clients->metadatas[i].email,"NoMail"); | ||
| 308 | + sprintf(reg_clients->metadatas[i].author_name,"NoAuthor"); | ||
| 309 | + sprintf(reg_clients->metadatas[i].homepage,"NoPage"); | ||
| 311 | } | 310 | } |
| 312 | } | 311 | } |
| 313 | - // Declare message | ||
| 314 | - std::string msg = ""; | ||
| 315 | - | ||
| 316 | - // Set methodResponse elts | ||
| 317 | - msg.append("<?xml version=\"1.0\"?>\n"); | ||
| 318 | - msg.append("<methodResponse>\n"); | ||
| 319 | - msg.append("\t<params>\n"); | ||
| 320 | - msg.append("\t\t<param>\n\t\t\t<value/>\n\t\t</param>\n"); | ||
| 321 | - msg.append("\t</params>\n"); | ||
| 322 | - msg.append("</methodResponse>\n"); | ||
| 323 | - post_string(msg,sock); | ||
| 324 | - //printf("Response message sent\n"); | 312 | + //sem_post(®_clients->lock); |
| 325 | //Return | 313 | //Return |
| 326 | return; | 314 | return; |
| 327 | } | 315 | } |
| @@ -334,7 +322,9 @@ void GVOHub::unregister(const GXml& xml,const socklen_t& sock) | @@ -334,7 +322,9 @@ void GVOHub::unregister(const GXml& xml,const socklen_t& sock) | ||
| 334 | void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) | 322 | void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) |
| 335 | { | 323 | { |
| 336 | char buffer[4096]; | 324 | char buffer[4096]; |
| 325 | + #if GVO_HUB_testing == 1 | ||
| 337 | printf("Client Metadata received\n"); | 326 | printf("Client Metadata received\n"); |
| 327 | + #endif | ||
| 338 | // Search for metadata values to store | 328 | // Search for metadata values to store |
| 339 | std::string client_calling = ""; | 329 | std::string client_calling = ""; |
| 340 | // Search for value of methodName | 330 | // Search for value of methodName |
| @@ -350,7 +340,6 @@ void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) | @@ -350,7 +340,6 @@ void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) | ||
| 350 | } | 340 | } |
| 351 | 341 | ||
| 352 | for (int i = 0; i < GVOHUB_NB_CLIENTS; i++) { | 342 | for (int i = 0; i < GVOHUB_NB_CLIENTS; i++) { |
| 353 | - printf("comparing Reference of client %s with seeked %s\n",reg_clients->metadatas[i].private_key,client_calling.c_str()); | ||
| 354 | if (strcmp(reg_clients->metadatas[i].private_key,client_calling.c_str()) == 0) { | 343 | if (strcmp(reg_clients->metadatas[i].private_key,client_calling.c_str()) == 0) { |
| 355 | printf("Client %s ready to be filled with metadata\n",reg_clients->metadatas[i].reference); | 344 | printf("Client %s ready to be filled with metadata\n",reg_clients->metadatas[i].reference); |
| 356 | std::string client_name = get_response_value(xml, "samp.name"); | 345 | std::string client_name = get_response_value(xml, "samp.name"); |
| @@ -369,6 +358,16 @@ void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) | @@ -369,6 +358,16 @@ void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) | ||
| 369 | sprintf(reg_clients->metadatas[i].author_name,client_authname.c_str()); | 358 | sprintf(reg_clients->metadatas[i].author_name,client_authname.c_str()); |
| 370 | std::string client_page = get_response_value(xml, "home.page"); | 359 | std::string client_page = get_response_value(xml, "home.page"); |
| 371 | sprintf(reg_clients->metadatas[i].homepage,client_page.c_str()); | 360 | sprintf(reg_clients->metadatas[i].homepage,client_page.c_str()); |
| 361 | + // Declare message | ||
| 362 | + std::string msg = ""; | ||
| 363 | + | ||
| 364 | + //The hub response to Metadata declaration has no usefull content and can be discarded by the client. | ||
| 365 | + // Set methodResponse elts | ||
| 366 | + msg.append("<?xml version=\"1.0\"?>\n"); | ||
| 367 | + msg.append("<methodResponse><params><param><value/></param></params>\n"); | ||
| 368 | + msg.append("</methodResponse>\n"); | ||
| 369 | + post_string(msg,sock); | ||
| 370 | + activate_callbacks("samp.hub.event.metadata",reg_clients->metadatas[i].reference); | ||
| 372 | break; | 371 | break; |
| 373 | } else { | 372 | } else { |
| 374 | if (i == GVOHUB_NB_CLIENTS - 1) { | 373 | if (i == GVOHUB_NB_CLIENTS - 1) { |
| @@ -378,15 +377,7 @@ void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) | @@ -378,15 +377,7 @@ void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) | ||
| 378 | } | 377 | } |
| 379 | 378 | ||
| 380 | 379 | ||
| 381 | - // Declare message | ||
| 382 | - std::string msg = ""; | ||
| 383 | - | ||
| 384 | - //The hub response to Metadata declaration has no usefull content and can be discarded by the client. | ||
| 385 | - // Set methodResponse elts | ||
| 386 | - msg.append("<?xml version=\"1.0\"?>\n"); | ||
| 387 | - msg.append("<methodResponse><params><param><value/></param></params>\n"); | ||
| 388 | - msg.append("</methodResponse>\n"); | ||
| 389 | - post_string(msg,sock); | 380 | + |
| 390 | //Return | 381 | //Return |
| 391 | return; | 382 | return; |
| 392 | } | 383 | } |
| @@ -419,7 +410,7 @@ void GVOHub::set_xml_rpc_callback(const GXml& xml,const socklen_t& sock) | @@ -419,7 +410,7 @@ void GVOHub::set_xml_rpc_callback(const GXml& xml,const socklen_t& sock) | ||
| 419 | std::cout << client_port << std::endl; | 410 | std::cout << client_port << std::endl; |
| 420 | 411 | ||
| 421 | for (i = 0; i < GVOHUB_NB_CLIENTS; i++) { | 412 | for (i = 0; i < GVOHUB_NB_CLIENTS; i++) { |
| 422 | - printf("comparing Reference of client %s with seeked %s\n",reg_clients->metadatas[i].private_key,client_calling.c_str()); | 413 | + //printf("comparing Reference of client %s with seeked %s\n",reg_clients->metadatas[i].private_key,client_calling.c_str()); |
| 423 | if (strcmp(reg_clients->metadatas[i].private_key,client_calling.c_str()) == 0) { | 414 | if (strcmp(reg_clients->metadatas[i].private_key,client_calling.c_str()) == 0) { |
| 424 | printf("Client %s ready to be filled with port information\n",reg_clients->metadatas[i].reference); | 415 | printf("Client %s ready to be filled with port information\n",reg_clients->metadatas[i].reference); |
| 425 | sprintf(reg_clients->metadatas[i].port,client_port.c_str()); | 416 | sprintf(reg_clients->metadatas[i].port,client_port.c_str()); |
| @@ -587,7 +578,7 @@ void GVOHub::declare_subscriptions(const GXml& xml,const socklen_t& sock) | @@ -587,7 +578,7 @@ void GVOHub::declare_subscriptions(const GXml& xml,const socklen_t& sock) | ||
| 587 | std::cout << "Client registered to following methods calls:" << std::endl; | 578 | std::cout << "Client registered to following methods calls:" << std::endl; |
| 588 | 579 | ||
| 589 | for (int i = 0; i < GVOHUB_NB_CLIENTS; i++) { | 580 | for (int i = 0; i < GVOHUB_NB_CLIENTS; i++) { |
| 590 | - printf("comparing Reference of client %s with seeked %s\n",reg_clients->metadatas[i].private_key,client_calling.c_str()); | 581 | + //printf("comparing Reference of client %s with seeked %s\n",reg_clients->metadatas[i].private_key,client_calling.c_str()); |
| 591 | if (strcmp(reg_clients->metadatas[i].private_key,client_calling.c_str()) == 0) { | 582 | if (strcmp(reg_clients->metadatas[i].private_key,client_calling.c_str()) == 0) { |
| 592 | for( j=0,p=client_subscriptions.begin(); j<client_subscriptions.size()-1; j++,p++ ) { | 583 | for( j=0,p=client_subscriptions.begin(); j<client_subscriptions.size()-1; j++,p++ ) { |
| 593 | std::cout << *p << std::endl; | 584 | std::cout << *p << std::endl; |
| @@ -654,6 +645,17 @@ void GVOHub::get_metadata(const GXml& xml,const socklen_t& sock) | @@ -654,6 +645,17 @@ void GVOHub::get_metadata(const GXml& xml,const socklen_t& sock) | ||
| 654 | msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.status</name>\n\t\t\t\t\t\t<value>samp.ok</value>\n\t\t\t\t\t</member>\n"); | 645 | msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.status</name>\n\t\t\t\t\t\t<value>samp.ok</value>\n\t\t\t\t\t</member>\n"); |
| 655 | 646 | ||
| 656 | for (int i = 0; i < GVOHUB_NB_CLIENTS; i++) { | 647 | for (int i = 0; i < GVOHUB_NB_CLIENTS; i++) { |
| 648 | + if (strcmp("gammalib_hub",client_calling.c_str()) == 0) { | ||
| 649 | + msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.name</name>\n\t\t\t\t\t\t<value>gammalib_hub</value>\n\t\t\t\t\t</member>\n"); | ||
| 650 | + msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.description.text</name>\n\t\t\t\t\t\t<value>Gamma lib hub.</value>\n\t\t\t\t\t</member>\n"); | ||
| 651 | + msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.icon.url</name>\n\t\t\t\t\t\t<value></value>\n\t\t\t\t\t</member>\n"); | ||
| 652 | + msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.documentation.url</name>\n\t\t\t\t\t\t<value>gammalib github documentation</value>\n\t\t\t\t\t</member>\n"); | ||
| 653 | + msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>author.affiliation</name>\n\t\t\t\t\t\t<value>IRAP, CNRS Toulouse</value>\n\t\t\t\t\t</member>\n"); | ||
| 654 | + msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>author.email</name>\n\t\t\t\t\t\t<value>dontcontactme@please</value>\n\t\t\t\t\t</member>\n"); | ||
| 655 | + msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>author.name</name>\n\t\t\t\t\t\t<value>J. Knödlseder, T. Louge</value>\n\t\t\t\t\t</member>\n"); | ||
| 656 | + msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>home.page</name>\n\t\t\t\t\t\t<value>no dedicated page</value>\n\t\t\t\t\t</member>\n"); | ||
| 657 | + break; | ||
| 658 | + } | ||
| 657 | if (strcmp(reg_clients->metadatas[i].reference,client_calling.c_str()) == 0) { | 659 | if (strcmp(reg_clients->metadatas[i].reference,client_calling.c_str()) == 0) { |
| 658 | printf("Client %s metadata retrieval:\n",reg_clients->metadatas[i].reference); | 660 | printf("Client %s metadata retrieval:\n",reg_clients->metadatas[i].reference); |
| 659 | msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.name</name>\n\t\t\t\t\t\t<value>"); | 661 | msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.name</name>\n\t\t\t\t\t\t<value>"); |
| @@ -691,7 +693,7 @@ void GVOHub::get_metadata(const GXml& xml,const socklen_t& sock) | @@ -691,7 +693,7 @@ void GVOHub::get_metadata(const GXml& xml,const socklen_t& sock) | ||
| 691 | msg.append("\t\t\t\t</struct>\n\t\t\t</value>\n\t\t</param>\n"); | 693 | msg.append("\t\t\t\t</struct>\n\t\t\t</value>\n\t\t</param>\n"); |
| 692 | msg.append("\t</params>\n"); | 694 | msg.append("\t</params>\n"); |
| 693 | msg.append("</methodResponse>\n"); | 695 | msg.append("</methodResponse>\n"); |
| 694 | - | 696 | + printf("Metadata for %s : \n %s",client_calling.c_str(),msg.c_str()); |
| 695 | post_string(msg,sock); | 697 | post_string(msg,sock); |
| 696 | 698 | ||
| 697 | //Return | 699 | //Return |
| @@ -732,11 +734,16 @@ void GVOHub::get_subscriptions(const GXml& xml,const socklen_t& sock) | @@ -732,11 +734,16 @@ void GVOHub::get_subscriptions(const GXml& xml,const socklen_t& sock) | ||
| 732 | char tempo[128]; | 734 | char tempo[128]; |
| 733 | for (i = 0; i < GVOHUB_NB_CLIENTS; i++) { | 735 | for (i = 0; i < GVOHUB_NB_CLIENTS; i++) { |
| 734 | if (strcmp(reg_clients->metadatas[i].reference,client_calling.c_str()) == 0) { | 736 | if (strcmp(reg_clients->metadatas[i].reference,client_calling.c_str()) == 0) { |
| 737 | + //printf("retrieving client %s\n",reg_clients->metadatas[i].reference); | ||
| 735 | for (j = 0; j < GVOHUB_NB_METHODS; j++) { | 738 | for (j = 0; j < GVOHUB_NB_METHODS; j++) { |
| 736 | - msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>"); | ||
| 737 | strcpy(tempo,reg_clients->metadatas[i].registered_methods[j]); | 739 | strcpy(tempo,reg_clients->metadatas[i].registered_methods[j]); |
| 738 | - msg.append(tempo); | ||
| 739 | - msg.append("</name>\n\t\t\t\t\t\t<value></value>\n\t\t\t\t\t</member>\n"); | 740 | + if (strcmp("",tempo) == 0) { |
| 741 | + continue; | ||
| 742 | + } else { | ||
| 743 | + msg.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>"); | ||
| 744 | + msg.append(tempo); | ||
| 745 | + msg.append("</name>\n\t\t\t\t\t\t<value></value>\n\t\t\t\t\t</member>\n"); | ||
| 746 | + } | ||
| 740 | } | 747 | } |
| 741 | } | 748 | } |
| 742 | } | 749 | } |
| @@ -823,8 +830,45 @@ void GVOHub::init_members(void) | @@ -823,8 +830,45 @@ void GVOHub::init_members(void) | ||
| 823 | //m_client_id.clear(); | 830 | //m_client_id.clear(); |
| 824 | m_socket = -1; // Signals no socket | 831 | m_socket = -1; // Signals no socket |
| 825 | m_nb_clients = 0; // No registered clients at initialization | 832 | m_nb_clients = 0; // No registered clients at initialization |
| 826 | - connected().clear(); | 833 | + |
| 834 | + //puts the structure array of clients in shared memory | ||
| 835 | + if ((shm_handler = shmget(CLEF, sizeof(clients_descriptor), 0666 | IPC_CREAT)) < 0) | ||
| 836 | + { | ||
| 837 | + std::string msg = "Could not open shared memory."; | ||
| 838 | + throw GException::invalid_value(G_INIT_MEMBERS, msg); | ||
| 839 | + } | ||
| 840 | + if ((ptr_mem_partagee = shmat(shm_handler, NULL, 0)) == (void*) -1) | ||
| 841 | + { | ||
| 842 | + std::string msg = "Could not attach shared memory."; | ||
| 843 | + throw GException::invalid_value(G_INIT_MEMBERS, msg); | ||
| 844 | + } | ||
| 845 | + reg_clients = (clients_descriptor *)ptr_mem_partagee; | ||
| 846 | + reg_clients->registered = 0; | ||
| 847 | + for (int i = 0; i < GVOHUB_NB_CLIENTS; i++) { | ||
| 848 | + strcpy(reg_clients->metadatas[i].reference,"NoRef"); | ||
| 849 | + strcpy(reg_clients->metadatas[i].private_key,"Unknown"); | ||
| 850 | + strcpy(reg_clients->metadatas[i].name,"Unknown"); | ||
| 851 | + strcpy(reg_clients->metadatas[i].icon,"Unknown"); | ||
| 852 | + strcpy(reg_clients->metadatas[i].documentation,"Unknown"); | ||
| 853 | + strcpy(reg_clients->metadatas[i].affiliation,"Unknown"); | ||
| 854 | + strcpy(reg_clients->metadatas[i].author_name,"Unknown"); | ||
| 855 | + strcpy(reg_clients->metadatas[i].email,"Unknown"); | ||
| 856 | + strcpy(reg_clients->metadatas[i].homepage,"Unknown"); | ||
| 857 | + strcpy(reg_clients->metadatas[i].port,"Unknown"); | ||
| 858 | + strcpy(reg_clients->metadatas[i].description,"Unknown"); | ||
| 859 | + | ||
| 860 | + } | ||
| 861 | + for (int j = 0; j < GVOHUB_NB_CLIENTS; j++) { | ||
| 862 | + printf("%s\n",reg_clients->metadatas[j].reference); | ||
| 863 | + } | ||
| 864 | + //sem_init(®_clients->lock, 0, 1); | ||
| 865 | + // Creates Hub | ||
| 866 | + printf("Creating the hub\n"); | ||
| 867 | + create_samp_file(); | ||
| 827 | 868 | ||
| 869 | + // Starts the hub | ||
| 870 | + printf("Starting the hub\n"); | ||
| 871 | + start_hub(); | ||
| 828 | // Return | 872 | // Return |
| 829 | return; | 873 | return; |
| 830 | } | 874 | } |
| @@ -846,7 +890,6 @@ void GVOHub::copy_members(const GVOHub& hub) | @@ -846,7 +890,6 @@ void GVOHub::copy_members(const GVOHub& hub) | ||
| 846 | m_client_key = hub.m_client_key; | 890 | m_client_key = hub.m_client_key; |
| 847 | m_hub_id = hub.m_hub_id; | 891 | m_hub_id = hub.m_hub_id; |
| 848 | m_socket = hub.m_socket; | 892 | m_socket = hub.m_socket; |
| 849 | - connected() = hub.connected(); | ||
| 850 | 893 | ||
| 851 | // Return | 894 | // Return |
| 852 | return; | 895 | return; |
| @@ -857,7 +900,16 @@ void GVOHub::copy_members(const GVOHub& hub) | @@ -857,7 +900,16 @@ void GVOHub::copy_members(const GVOHub& hub) | ||
| 857 | * @brief Delete class members | 900 | * @brief Delete class members |
| 858 | ***************************************************************************/ | 901 | ***************************************************************************/ |
| 859 | void GVOHub::free_members(void) | 902 | void GVOHub::free_members(void) |
| 860 | -{ | 903 | +{ |
| 904 | + struct shmid_ds *buf; | ||
| 905 | + | ||
| 906 | + std::cout << "I am here" << std::endl; | ||
| 907 | + std::string lockurl = get_hub_lockfile(); | ||
| 908 | + printf("Deleting file: %s\n",lockurl.c_str()); | ||
| 909 | + fflush(stdout); | ||
| 910 | + std::remove(lockurl.c_str()); | ||
| 911 | + shmdt(ptr_mem_partagee); | ||
| 912 | + shmctl(shm_handler, IPC_RMID, buf); | ||
| 861 | // Return | 913 | // Return |
| 862 | return; | 914 | return; |
| 863 | } | 915 | } |
| @@ -869,7 +921,7 @@ void GVOHub::free_members(void) | @@ -869,7 +921,7 @@ void GVOHub::free_members(void) | ||
| 869 | * | 921 | * |
| 870 | * Implements IVOA standard REC-SAMP-1.3-20120411. | 922 | * Implements IVOA standard REC-SAMP-1.3-20120411. |
| 871 | ***************************************************************************/ | 923 | ***************************************************************************/ |
| 872 | -void GVOHub::init_hub(void) | 924 | +void GVOHub::create_samp_file(void) |
| 873 | { | 925 | { |
| 874 | // Get lockfile URL | 926 | // Get lockfile URL |
| 875 | std::string lockurl = get_hub_lockfile(); | 927 | std::string lockurl = get_hub_lockfile(); |
| @@ -902,33 +954,6 @@ void GVOHub::init_hub(void) | @@ -902,33 +954,6 @@ void GVOHub::init_hub(void) | ||
| 902 | // Close SAMP lockfile | 954 | // Close SAMP lockfile |
| 903 | fclose(fptr); | 955 | fclose(fptr); |
| 904 | 956 | ||
| 905 | - //puts the structure array of clients in shared memory | ||
| 906 | - if ((shm_handler = shmget(CLEF, sizeof(clients_descriptor), 0666 | IPC_CREAT)) < 0) | ||
| 907 | - { | ||
| 908 | - exit(1); | ||
| 909 | - } | ||
| 910 | - if ((ptr_mem_partagee = shmat(shm_handler, NULL, 0)) == (void*) -1) | ||
| 911 | - { | ||
| 912 | - exit(1); | ||
| 913 | - } | ||
| 914 | - reg_clients = (clients_descriptor *)ptr_mem_partagee; | ||
| 915 | - reg_clients->registered = 0; | ||
| 916 | - for (int i = 0; i < GVOHUB_NB_CLIENTS; i++) { | ||
| 917 | - strcpy(reg_clients->metadatas[i].reference,"NoRef"); | ||
| 918 | - } | ||
| 919 | - for (int j = 0; j < GVOHUB_NB_CLIENTS; j++) { | ||
| 920 | - printf("%s\n",reg_clients->metadatas[j].reference); | ||
| 921 | - } | ||
| 922 | - fptr = fopen("SAMP-registered.txt", "w"); | ||
| 923 | - if (fptr != NULL) { | ||
| 924 | - | ||
| 925 | - // If successfull writes application definition | ||
| 926 | - fputs ("# SAMP registered applications and Methods \n",fptr); | ||
| 927 | - } | ||
| 928 | - | ||
| 929 | - // Closes file | ||
| 930 | - fclose(fptr); | ||
| 931 | - | ||
| 932 | // Return | 957 | // Return |
| 933 | return; | 958 | return; |
| 934 | } | 959 | } |
| @@ -1008,15 +1033,6 @@ void GVOHub::handle_request(const socklen_t& sock) | @@ -1008,15 +1033,6 @@ void GVOHub::handle_request(const socklen_t& sock) | ||
| 1008 | } | 1033 | } |
| 1009 | printf("Here is the message: %s\n",buffer); | 1034 | printf("Here is the message: %s\n",buffer); |
| 1010 | std::string response = buffer; | 1035 | std::string response = buffer; |
| 1011 | - /* | ||
| 1012 | - int j = read(sock,buffer,4096); | ||
| 1013 | - if (j < 0) { | ||
| 1014 | - std::string msg = "Could not read socket buffer."; | ||
| 1015 | - throw GException::invalid_value(G_HANDLE_REQUEST, msg); | ||
| 1016 | - } | ||
| 1017 | - printf("Here is the second message: %s\n",buffer); | ||
| 1018 | - */ | ||
| 1019 | - | ||
| 1020 | 1036 | ||
| 1021 | // Find start of XML text | 1037 | // Find start of XML text |
| 1022 | size_t start = response.find("<?xml"); | 1038 | size_t start = response.find("<?xml"); |
| @@ -1039,8 +1055,6 @@ void GVOHub::handle_request(const socklen_t& sock) | @@ -1039,8 +1055,6 @@ void GVOHub::handle_request(const socklen_t& sock) | ||
| 1039 | method_called = text->text(); | 1055 | method_called = text->text(); |
| 1040 | } | 1056 | } |
| 1041 | } | 1057 | } |
| 1042 | - // endif: connection has been established | ||
| 1043 | - //std::string method_called = get_response_value(xml, "methodName"); | ||
| 1044 | if (method_called.compare("samp.hub.ping") == 0) { | 1058 | if (method_called.compare("samp.hub.ping") == 0) { |
| 1045 | ping_service(sock); | 1059 | ping_service(sock); |
| 1046 | } | 1060 | } |
| @@ -1089,28 +1103,12 @@ void GVOHub::handle_request(const socklen_t& sock) | @@ -1089,28 +1103,12 @@ void GVOHub::handle_request(const socklen_t& sock) | ||
| 1089 | if (method_called.compare("samp.hub.reply") == 0) { | 1103 | if (method_called.compare("samp.hub.reply") == 0) { |
| 1090 | ping_service(sock); | 1104 | ping_service(sock); |
| 1091 | } | 1105 | } |
| 1092 | - //Test if any registered client needs to know that the method has been called | ||
| 1093 | - for (i = 0; i < GVOHUB_NB_CLIENTS; i++) { | ||
| 1094 | - for (j = 0; j < GVOHUB_NB_METHODS; j++) { | ||
| 1095 | - if (strcmp(method_called.c_str(),reg_clients->metadatas[i].registered_methods[j]) == 0) { | ||
| 1096 | - printf("Callback needed\n"); | ||
| 1097 | - } | ||
| 1098 | - } | ||
| 1099 | - | ||
| 1100 | - } | 1106 | + |
| 1101 | 1107 | ||
| 1102 | // Return | 1108 | // Return |
| 1103 | return; | 1109 | return; |
| 1104 | } | 1110 | } |
| 1105 | -/***********************************************************************//** | ||
| 1106 | - * @brief Closes SAMP hub shm | ||
| 1107 | - * | ||
| 1108 | - * @return | ||
| 1109 | - * | ||
| 1110 | - ***************************************************************************/ | ||
| 1111 | -/*void intHandler(int sig) { | ||
| 1112 | - shmdt(ptr_mem_partagee); | ||
| 1113 | -}*/ | 1111 | + |
| 1114 | /***********************************************************************//** | 1112 | /***********************************************************************//** |
| 1115 | * @brief Starts the SAMP hub socket and listens on it | 1113 | * @brief Starts the SAMP hub socket and listens on it |
| 1116 | * | 1114 | * |
| @@ -1206,7 +1204,7 @@ void GVOHub::start_hub(void) | @@ -1206,7 +1204,7 @@ void GVOHub::start_hub(void) | ||
| 1206 | signal(pid, SIG_IGN); | 1204 | signal(pid, SIG_IGN); |
| 1207 | } | 1205 | } |
| 1208 | 1206 | ||
| 1209 | - } // endwhile | 1207 | + } |
| 1210 | 1208 | ||
| 1211 | 1209 | ||
| 1212 | // Return | 1210 | // Return |
| @@ -1302,7 +1300,7 @@ std::list<std::string> GVOHub::get_registrations(const GXml& xml, | @@ -1302,7 +1300,7 @@ std::list<std::string> GVOHub::get_registrations(const GXml& xml, | ||
| 1302 | std::cout << *(node->element("member", i)) << std::cout;*/ | 1300 | std::cout << *(node->element("member", i)) << std::cout;*/ |
| 1303 | subnode = node->element("member", i); | 1301 | subnode = node->element("member", i); |
| 1304 | subnode = subnode->element("name", 0); | 1302 | subnode = subnode->element("name", 0); |
| 1305 | - std::cout << node->element("member",i)->element("name", 0)->print(NORMAL,0) << std::cout; | 1303 | + //std::cout << node->element("member",i)->element("name", 0)->print(NORMAL,0) << std::cout; |
| 1306 | const GXmlText* text = static_cast<const GXmlText*>((*subnode)[0]); | 1304 | const GXmlText* text = static_cast<const GXmlText*>((*subnode)[0]); |
| 1307 | if (text != NULL) { | 1305 | if (text != NULL) { |
| 1308 | value.push_front(text->text()); | 1306 | value.push_front(text->text()); |
| @@ -1439,13 +1437,15 @@ void GVOHub::post_string(const std::string& content,const socklen_t& sock) const | @@ -1439,13 +1437,15 @@ void GVOHub::post_string(const std::string& content,const socklen_t& sock) const | ||
| 1439 | 1437 | ||
| 1440 | // Build post string | 1438 | // Build post string |
| 1441 | std::string post = prefix + content; | 1439 | std::string post = prefix + content; |
| 1442 | - //printf(post.c_str()); | 1440 | + #if GVO_HUB_testing == 1 |
| 1441 | + printf(post.c_str()); | ||
| 1442 | + #endif | ||
| 1443 | // Send content to socket | 1443 | // Send content to socket |
| 1444 | bool done = false; | 1444 | bool done = false; |
| 1445 | do { | 1445 | do { |
| 1446 | int length = post.length(); | 1446 | int length = post.length(); |
| 1447 | int sent_length = send(sock, post.c_str(), length, 0); | 1447 | int sent_length = send(sock, post.c_str(), length, 0); |
| 1448 | - printf("Sent through socket: \n %s",post.c_str()); | 1448 | + //printf("Sent through socket: \n %s",post.c_str()); |
| 1449 | if (sent_length < length) { | 1449 | if (sent_length < length) { |
| 1450 | post = post.substr(sent_length, std::string::npos); | 1450 | post = post.substr(sent_length, std::string::npos); |
| 1451 | } | 1451 | } |
| @@ -1483,6 +1483,7 @@ std::string GVOHub::receive_string(const socklen_t& sock) const | @@ -1483,6 +1483,7 @@ std::string GVOHub::receive_string(const socklen_t& sock) const | ||
| 1483 | int n = 0; | 1483 | int n = 0; |
| 1484 | int m = 0; | 1484 | int m = 0; |
| 1485 | //do { | 1485 | //do { |
| 1486 | + | ||
| 1486 | printf("reading socket\n"); | 1487 | printf("reading socket\n"); |
| 1487 | n = recv(sock, buffer, 4096,0); | 1488 | n = recv(sock, buffer, 4096,0); |
| 1488 | printf("%d octets received: message %s\n",n,buffer); | 1489 | printf("%d octets received: message %s\n",n,buffer); |
| @@ -1539,7 +1540,9 @@ std::list<std::string> GVOHub::get_clientid(const GXml& xml, | @@ -1539,7 +1540,9 @@ std::list<std::string> GVOHub::get_clientid(const GXml& xml, | ||
| 1539 | const GXmlText* text = static_cast<const GXmlText*>((*node)[0]); | 1540 | const GXmlText* text = static_cast<const GXmlText*>((*node)[0]); |
| 1540 | if (text != NULL) { | 1541 | if (text != NULL) { |
| 1541 | value.push_front(text->text()); | 1542 | value.push_front(text->text()); |
| 1543 | + #if GVO_HUB_testing == 1 | ||
| 1542 | std::cout << "Client id for which information is seeked:" + text->text() + "\n"; | 1544 | std::cout << "Client id for which information is seeked:" + text->text() + "\n"; |
| 1545 | + #endif | ||
| 1543 | } | 1546 | } |
| 1544 | } | 1547 | } |
| 1545 | } | 1548 | } |
| @@ -1549,8 +1552,13 @@ std::list<std::string> GVOHub::get_clientid(const GXml& xml, | @@ -1549,8 +1552,13 @@ std::list<std::string> GVOHub::get_clientid(const GXml& xml, | ||
| 1549 | // Return value | 1552 | // Return value |
| 1550 | return value; | 1553 | return value; |
| 1551 | } | 1554 | } |
| 1552 | -/* | ||
| 1553 | -*/ | 1555 | +/***********************************************************************//** |
| 1556 | + * @brief | ||
| 1557 | + * | ||
| 1558 | + * @param[in] | ||
| 1559 | + * | ||
| 1560 | + * | ||
| 1561 | + ***************************************************************************/ | ||
| 1554 | std::string GVOHub::random_string( size_t length ) | 1562 | std::string GVOHub::random_string( size_t length ) |
| 1555 | { | 1563 | { |
| 1556 | srand(time(0)); | 1564 | srand(time(0)); |
| @@ -1563,3 +1571,259 @@ std::string GVOHub::random_string( size_t length ) | @@ -1563,3 +1571,259 @@ std::string GVOHub::random_string( size_t length ) | ||
| 1563 | return str; | 1571 | return str; |
| 1564 | } | 1572 | } |
| 1565 | 1573 | ||
| 1574 | +/***********************************************************************//** | ||
| 1575 | + * @brief Test if any registered client needs to know that the method | ||
| 1576 | + has been called | ||
| 1577 | + * | ||
| 1578 | + * @param[in] method: name of the method, cl_id id of calling client | ||
| 1579 | + * | ||
| 1580 | + * | ||
| 1581 | + * | ||
| 1582 | + * | ||
| 1583 | + ***************************************************************************/ | ||
| 1584 | +void GVOHub::activate_callbacks(std::string method,char cl_id[31]) | ||
| 1585 | +{ | ||
| 1586 | + int i,j,k; | ||
| 1587 | + char port[16]; | ||
| 1588 | + char pkey[16]; | ||
| 1589 | + std::string spkey; | ||
| 1590 | + | ||
| 1591 | + for (i = 0; i < GVOHUB_NB_CLIENTS; i++) { | ||
| 1592 | + for (j = 0; j < GVOHUB_NB_METHODS; j++) { | ||
| 1593 | + if (strcmp("",reg_clients->metadatas[i].registered_methods[j]) == 0) { | ||
| 1594 | + continue; | ||
| 1595 | + } else { | ||
| 1596 | + //printf("Comparing %s and %s \n",method.c_str(),reg_clients->metadatas[i].registered_methods[j]); | ||
| 1597 | + if (strcmp(method.c_str(),reg_clients->metadatas[i].registered_methods[j]) == 0) { | ||
| 1598 | + strcpy(port,reg_clients->metadatas[i].port); | ||
| 1599 | + printf("Callback needed on port %s\n",port); | ||
| 1600 | + std::string port_string = std::string(port); | ||
| 1601 | + //Eliminate http://127.0.0.1/ from port string -----> improve this code is necessary | ||
| 1602 | + port_string.replace(0,17,""); | ||
| 1603 | + printf("Callback needed on port %s\n",port_string.c_str()); | ||
| 1604 | + std::size_t pos = port_string.find("/"); | ||
| 1605 | + std::string port_only = port_string.substr(0,pos); | ||
| 1606 | + printf("%s\n",port_only.c_str()); | ||
| 1607 | + // Set hints | ||
| 1608 | + struct addrinfo hints; | ||
| 1609 | + std::memset(&hints, 0, sizeof(hints)); | ||
| 1610 | + hints.ai_family = AF_INET; | ||
| 1611 | + hints.ai_socktype = SOCK_STREAM; | ||
| 1612 | + | ||
| 1613 | + // Get server information | ||
| 1614 | + struct addrinfo* servinfo; | ||
| 1615 | + if (getaddrinfo("127.0.0.1", port_only.c_str(), | ||
| 1616 | + &hints, &servinfo) == 0) { | ||
| 1617 | + | ||
| 1618 | + // Loop through all the results and connect to the first | ||
| 1619 | + // we can | ||
| 1620 | + for (struct addrinfo* ptr = servinfo; ptr != NULL; ptr = ptr->ai_next) { | ||
| 1621 | + | ||
| 1622 | + // Create socket | ||
| 1623 | + cback_socket = socket(ptr->ai_family, | ||
| 1624 | + ptr->ai_socktype, | ||
| 1625 | + ptr->ai_protocol); | ||
| 1626 | + | ||
| 1627 | + // Connect to socket if socket is valid | ||
| 1628 | + if (cback_socket != -1) { | ||
| 1629 | + if (::connect(cback_socket, | ||
| 1630 | + ptr->ai_addr, | ||
| 1631 | + ptr->ai_addrlen) == -1) { | ||
| 1632 | + close(cback_socket); | ||
| 1633 | + cback_socket = -1; | ||
| 1634 | + } | ||
| 1635 | + } | ||
| 1636 | + | ||
| 1637 | + } // endfor: looped through all results | ||
| 1638 | + | ||
| 1639 | + } // endif: server information was valid | ||
| 1640 | + std::string msg_cback = ""; | ||
| 1641 | + | ||
| 1642 | + if (strcmp(method.c_str(),"samp.hub.event.register") == 0) { | ||
| 1643 | + // Set methodResponse elts for samp.hub.event.register | ||
| 1644 | + msg_cback.append("<?xml version=\"1.0\"?>\n"); | ||
| 1645 | + | ||
| 1646 | + msg_cback.append("<methodCall><methodName>samp.client.receiveNotification</methodName>\n"); | ||
| 1647 | + msg_cback.append("\t<params>\n"); | ||
| 1648 | + msg_cback.append("\t\t<param><value>"); | ||
| 1649 | + msg_cback.append(reg_clients->metadatas[i].private_key); | ||
| 1650 | + msg_cback.append("</value></param>\n"); | ||
| 1651 | + msg_cback.append("\t\t<param><value>"+m_hub_id+"</value></param>\n"); | ||
| 1652 | + msg_cback.append("\t\t<param>\n\t\t\t<value>\n\t\t\t\t<struct>\n"); | ||
| 1653 | + msg_cback.append("\t\t\t\t\t<member><name>samp.mtype</name><value>samp.hub.event.register</value></member>\n"); | ||
| 1654 | + msg_cback.append("\t\t\t\t\t<member><name>samp.params</name><value>\n\t\t\t\t\t\t<struct>\n\t\t\t\t\t\t\t<member>"); | ||
| 1655 | + msg_cback.append("<name>id</name><value>"); | ||
| 1656 | + msg_cback.append(cl_id); | ||
| 1657 | + msg_cback.append("</value></member>\n\t\t\t\t\t\t</struct>\n\t\t\t\t\t</value></member>\n"); | ||
| 1658 | + msg_cback.append("\t\t\t\t</struct>\n\t\t\t</value>\n\t\t</param>\n"); | ||
| 1659 | + msg_cback.append("\t</params>\n"); | ||
| 1660 | + | ||
| 1661 | + msg_cback.append("</methodCall>\n"); | ||
| 1662 | + post_string_toclient(msg_cback); | ||
| 1663 | + } | ||
| 1664 | + if (strcmp(method.c_str(),"samp.hub.event.unregister") == 0) { | ||
| 1665 | + // Set methodResponse elts for samp.hub.event.unregister | ||
| 1666 | + msg_cback.append("<?xml version=\"1.0\"?>\n"); | ||
| 1667 | + | ||
| 1668 | + msg_cback.append("<methodCall><methodName>samp.client.receiveNotification</methodName>\n"); | ||
| 1669 | + msg_cback.append("\t<params>\n"); | ||
| 1670 | + msg_cback.append("\t\t<param><value>"); | ||
| 1671 | + msg_cback.append(reg_clients->metadatas[i].private_key); | ||
| 1672 | + msg_cback.append("</value></param>\n"); | ||
| 1673 | + msg_cback.append("\t\t<param><value>"+m_hub_id+"</value></param>\n"); | ||
| 1674 | + msg_cback.append("\t\t<param>\n\t\t\t<value>\n\t\t\t\t<struct>\n"); | ||
| 1675 | + msg_cback.append("\t\t\t\t\t<member><name>samp.mtype</name><value>samp.hub.event.unregister</value></member>\n"); | ||
| 1676 | + msg_cback.append("\t\t\t\t\t<member><name>samp.params</name><value>\n\t\t\t\t\t\t<struct>\n\t\t\t\t\t\t\t<member>"); | ||
| 1677 | + msg_cback.append("<name>id</name><value>"); | ||
| 1678 | + msg_cback.append(cl_id); | ||
| 1679 | + msg_cback.append("</value></member>\n\t\t\t\t\t\t</struct>\n\t\t\t\t\t</value></member>\n"); | ||
| 1680 | + msg_cback.append("\t\t\t\t</struct>\n\t\t\t</value>\n\t\t</param>\n"); | ||
| 1681 | + msg_cback.append("\t</params>\n"); | ||
| 1682 | + | ||
| 1683 | + msg_cback.append("</methodCall>\n"); | ||
| 1684 | + post_string_toclient(msg_cback); | ||
| 1685 | + | ||
| 1686 | + } | ||
| 1687 | + if (strcmp(method.c_str(),"samp.hub.event.metadata") == 0) { | ||
| 1688 | + // Set methodResponse elts for samp.hub.event.unregister | ||
| 1689 | + msg_cback.append("<?xml version=\"1.0\"?>\n"); | ||
| 1690 | + | ||
| 1691 | + msg_cback.append("<methodCall><methodName>samp.client.receiveNotification</methodName>\n"); | ||
| 1692 | + msg_cback.append("\t<params>\n"); | ||
| 1693 | + msg_cback.append("\t\t<param><value>"); | ||
| 1694 | + msg_cback.append(reg_clients->metadatas[i].private_key); | ||
| 1695 | + msg_cback.append("</value></param>\n"); | ||
| 1696 | + msg_cback.append("\t\t<param><value>"+m_hub_id+"</value></param>\n"); | ||
| 1697 | + msg_cback.append("\t\t<param>\n\t\t\t<value>\n\t\t\t\t<struct>\n"); | ||
| 1698 | + msg_cback.append("\t\t\t\t\t<member><name>samp.mtype</name><value>samp.hub.event.metadata</value></member>\n"); | ||
| 1699 | + msg_cback.append("\t\t\t\t\t<member><name>samp.params</name><value>\n\t\t\t\t\t\t<struct>\n\t\t\t\t\t\t\t"); | ||
| 1700 | + msg_cback.append("\t\t\t\t\t<member><name>id</name><value>"); | ||
| 1701 | + for (k = 0; k < GVOHUB_NB_CLIENTS; k++) { | ||
| 1702 | + if (strcmp(cl_id,reg_clients->metadatas[k].reference) == 0) { | ||
| 1703 | + break; | ||
| 1704 | + } | ||
| 1705 | + } | ||
| 1706 | + msg_cback.append(reg_clients->metadatas[k].reference); | ||
| 1707 | + msg_cback.append("</value>\n\t\t\t\t\t</member>\n"); | ||
| 1708 | + msg_cback.append("\t\t\t\t\t<member><name>metadata</name><value>\n\t\t\t\t\t\t<struct>\n\t\t\t\t\t\t\t"); | ||
| 1709 | + msg_cback.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.name</name>\n\t\t\t\t\t\t<value>"); | ||
| 1710 | + msg_cback.append(reg_clients->metadatas[k].name); | ||
| 1711 | + msg_cback.append("</value>\n\t\t\t\t\t</member>\n"); | ||
| 1712 | + msg_cback.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.description.text</name>\n\t\t\t\t\t\t<value>"); | ||
| 1713 | + msg_cback.append(reg_clients->metadatas[k].description); | ||
| 1714 | + msg_cback.append("</value>\n\t\t\t\t\t</member>\n"); | ||
| 1715 | + msg_cback.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.icon.url</name>\n\t\t\t\t\t\t<value>"); | ||
| 1716 | + msg_cback.append(reg_clients->metadatas[k].icon); | ||
| 1717 | + msg_cback.append("</value>\n\t\t\t\t\t</member>\n"); | ||
| 1718 | + msg_cback.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>samp.documentation.url</name>\n\t\t\t\t\t\t<value>"); | ||
| 1719 | + msg_cback.append(reg_clients->metadatas[k].documentation); | ||
| 1720 | + msg_cback.append("</value>\n\t\t\t\t\t</member>\n"); | ||
| 1721 | + msg_cback.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>author.affiliation</name>\n\t\t\t\t\t\t<value>"); | ||
| 1722 | + msg_cback.append(reg_clients->metadatas[k].affiliation); | ||
| 1723 | + msg_cback.append("</value>\n\t\t\t\t\t</member>\n"); | ||
| 1724 | + msg_cback.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>author.email</name>\n\t\t\t\t\t\t<value>"); | ||
| 1725 | + msg_cback.append(reg_clients->metadatas[k].email); | ||
| 1726 | + msg_cback.append("</value>\n\t\t\t\t\t</member>\n"); | ||
| 1727 | + msg_cback.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>author.name</name>\n\t\t\t\t\t\t<value>"); | ||
| 1728 | + msg_cback.append(reg_clients->metadatas[k].author_name); | ||
| 1729 | + msg_cback.append("</value>\n\t\t\t\t\t</member>\n"); | ||
| 1730 | + msg_cback.append("\t\t\t\t\t<member>\n\t\t\t\t\t\t<name>home.page</name>\n\t\t\t\t\t\t<value>"); | ||
| 1731 | + msg_cback.append(reg_clients->metadatas[k].homepage); | ||
| 1732 | + msg_cback.append("</value>\n\t\t\t\t\t</member>\n"); | ||
| 1733 | + msg_cback.append("</struct></value></member>\n"); | ||
| 1734 | + msg_cback.append("</struct>\n\t\t\t\t\t</value></member>\n"); | ||
| 1735 | + msg_cback.append("\t\t\t\t</struct>\n\t\t\t</value>\n\t\t</param>\n"); | ||
| 1736 | + msg_cback.append("\t</params>\n"); | ||
| 1737 | + | ||
| 1738 | + msg_cback.append("</methodCall>\n"); | ||
| 1739 | + post_string_toclient(msg_cback); | ||
| 1740 | + | ||
| 1741 | + } | ||
| 1742 | + | ||
| 1743 | + | ||
| 1744 | + | ||
| 1745 | + } | ||
| 1746 | + } | ||
| 1747 | + } | ||
| 1748 | + | ||
| 1749 | + } | ||
| 1750 | +} | ||
| 1751 | +/***********************************************************************//** | ||
| 1752 | + * @brief Post string content to Hub | ||
| 1753 | + * | ||
| 1754 | + * @param[in] content String content to post | ||
| 1755 | + * | ||
| 1756 | + * Posts the content of a string to the Hub. | ||
| 1757 | + * | ||
| 1758 | + * The method does nothing if no Hub connection has been established. | ||
| 1759 | + ***************************************************************************/ | ||
| 1760 | +void GVOHub::post_string_toclient(const std::string& content) const | ||
| 1761 | +{ | ||
| 1762 | + // Continue only if Hub connection has been established | ||
| 1763 | + if (cback_socket != -1) { | ||
| 1764 | + | ||
| 1765 | + // Determine content length | ||
| 1766 | + int length = content.length(); | ||
| 1767 | + | ||
| 1768 | + // Set prefix | ||
| 1769 | + std::string prefix = "POST /xmlrpc HTTP/1.1\n" | ||
| 1770 | + "Connection: keep-alive\n" | ||
| 1771 | + "User-Agent: GammaLib\n" | ||
| 1772 | + "Host: localhost:"+gammalib::str(cback_socket)+"\n" | ||
| 1773 | + "Content-Type: text/xml\n" | ||
| 1774 | + "Content-Length: "+gammalib::str(length)+"\n\n"; | ||
| 1775 | + | ||
| 1776 | + // Build post string | ||
| 1777 | + std::string post = prefix + content; | ||
| 1778 | + | ||
| 1779 | + // Send content to socket | ||
| 1780 | + bool done = false; | ||
| 1781 | + do { | ||
| 1782 | + int length = post.length(); | ||
| 1783 | + int sent_length = send(cback_socket, post.c_str(), length, 0); | ||
| 1784 | + #if GVO_HUB_testing == 1 | ||
| 1785 | + printf("Send to client: %s\n",post.c_str()); | ||
| 1786 | + #endif | ||
| 1787 | + if (sent_length < length) { | ||
| 1788 | + post = post.substr(sent_length, std::string::npos); | ||
| 1789 | + } | ||
| 1790 | + else { | ||
| 1791 | + done = true; | ||
| 1792 | + } | ||
| 1793 | + } while (!done); | ||
| 1794 | + | ||
| 1795 | + // Read buffer until it is empty | ||
| 1796 | + char buffer[1001]; | ||
| 1797 | + int n = 0; | ||
| 1798 | + do { | ||
| 1799 | + printf("receive socket instruction from callback response\n"); | ||
| 1800 | + fflush(stdout); | ||
| 1801 | + n = recv(cback_socket, buffer, 1000, 0); | ||
| 1802 | + printf("data received: %s\n",buffer); | ||
| 1803 | + fflush(stdout); | ||
| 1804 | + if (n > 0) { | ||
| 1805 | + buffer[n+1] = '\0'; | ||
| 1806 | + | ||
| 1807 | + } | ||
| 1808 | + } while (n > 0); | ||
| 1809 | + /*printf("%s",buffer); | ||
| 1810 | + // Declare message | ||
| 1811 | + std::string msg = ""; | ||
| 1812 | + | ||
| 1813 | + // Set methodResponse elts | ||
| 1814 | + msg.append("<?xml version=\"1.0\"?>\n"); | ||
| 1815 | + msg.append("<methodResponse>\n"); | ||
| 1816 | + msg.append("\t<params>\n"); | ||
| 1817 | + msg.append("\t\t<param>\n\t\t\t<value/>\n\t\t</param>\n"); | ||
| 1818 | + msg.append("\t</params>\n"); | ||
| 1819 | + msg.append("</methodResponse>\n"); | ||
| 1820 | + | ||
| 1821 | + | ||
| 1822 | + | ||
| 1823 | + post_string(msg,cback_socket);*/ | ||
| 1824 | + } // endif: Hub connection had been established | ||
| 1825 | + | ||
| 1826 | + // Return | ||
| 1827 | + return; | ||
| 1828 | +} | ||
| 1829 | + |