diff --git a/include/GVOApp.hpp b/include/GVOApp.hpp index e425bb8..97cb7a1 100644 --- a/include/GVOApp.hpp +++ b/include/GVOApp.hpp @@ -77,8 +77,8 @@ protected: // Protected data area std::string m_name; //!< Client name char m_id[32]; //!< Id assigned to client by the hub - std::list registered_calls; //!< Calls for which is registered the application. - std::list::iterator iterator_calls; + std::list registeredMethods; //!< Calls for which is registered the application. + //std::list::iterator iterator_calls; }; diff --git a/include/GVOHub.hpp b/include/GVOHub.hpp index 95adbb9..1a158de 100644 --- a/include/GVOHub.hpp +++ b/include/GVOHub.hpp @@ -75,6 +75,8 @@ protected: void unregister(const socklen_t& sock); void handle_request(const socklen_t& sock); void register_metadata(const GXml& xml,const socklen_t& sock); + void set_xml_rpc_callback(const GXml& xml,const socklen_t& sock); + void get_registered_clients(const GXml& xml,const socklen_t& sock); void declare_subscriptions(const GXml& xml,const socklen_t& sock); // Low-level methods @@ -84,6 +86,8 @@ protected: const std::string& name) const; std::list get_registrations(const GXml& xml, const std::string& name) const; + std::string get_callback_port(const GXml& xml, + const std::string& name) const; void get_name_value_pair(const GXmlNode* node, std::string& name, std::string& value) const; @@ -99,13 +103,11 @@ protected: std::string m_client_key; //!< Private client key 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 -<<<<<<< HEAD - int m_nb_clients; //!< Number of already registered clients - static std::list m_connected_apps; //!< list of apps connected to the hub -======= int m_nb_clients; //!< Number of already registered clients - std::list m_connected_apps; //!< list of apps connected to the hub ->>>>>>> dab81eb3c037358cd6c4dc35ed8cc4e35a5646c0 + static std::vector& connected() { + static std::vector m_connected_apps; //!< list of apps connected to the hub + return m_connected_apps; + } }; #endif /* GVOHUB_HPP */ diff --git a/registrations.txt b/registrations.txt index 6f829ba..b14c129 100644 --- a/registrations.txt +++ b/registrations.txt @@ -541,4 +541,52 @@ GXmlElement::name GXmlText::samp.hub.event.unregisterGXmlElement::name ======= >>>>>>> parent of a9b1ce3... Hub is functionning, pb with visibility of list of apps + GXmlText::script.aladin.sendGXmlElement::name + GXmlText::samp.hub.event.registerGXmlElement::name + GXmlText::table.select.rowListGXmlElement::name + GXmlText::table.highlight.rowGXmlElement::name + GXmlText::table.load.fitsGXmlElement::name + GXmlText::samp.app.pingGXmlElement::name + GXmlText::coord.pointAt.skyGXmlElement::name + GXmlText::samp.hub.event.shutdownGXmlElement::name + GXmlText::image.load.fitsGXmlElement::name + GXmlText::samp.hub.disconnectGXmlElement::name + GXmlText::table.load.votableGXmlElement::name + GXmlText::samp.hub.event.unregisterGXmlElement::name + GXmlText::script.aladin.sendGXmlElement::name + GXmlText::samp.hub.event.registerGXmlElement::name + GXmlText::table.select.rowListGXmlElement::name + GXmlText::table.highlight.rowGXmlElement::name + GXmlText::table.load.fitsGXmlElement::name + GXmlText::samp.app.pingGXmlElement::name + GXmlText::coord.pointAt.skyGXmlElement::name + GXmlText::samp.hub.event.shutdownGXmlElement::name + GXmlText::image.load.fitsGXmlElement::name + GXmlText::samp.hub.disconnectGXmlElement::name + GXmlText::table.load.votableGXmlElement::name + GXmlText::samp.hub.event.unregisterGXmlElement::name + GXmlText::script.aladin.sendGXmlElement::name + GXmlText::samp.hub.event.registerGXmlElement::name + GXmlText::table.select.rowListGXmlElement::name + GXmlText::table.highlight.rowGXmlElement::name + GXmlText::table.load.fitsGXmlElement::name + GXmlText::samp.app.pingGXmlElement::name + GXmlText::coord.pointAt.skyGXmlElement::name + GXmlText::samp.hub.event.shutdownGXmlElement::name + GXmlText::image.load.fitsGXmlElement::name + GXmlText::samp.hub.disconnectGXmlElement::name + GXmlText::table.load.votableGXmlElement::name + GXmlText::samp.hub.event.unregisterGXmlElement::name + GXmlText::script.aladin.sendGXmlElement::name + GXmlText::samp.hub.event.registerGXmlElement::name + GXmlText::table.select.rowListGXmlElement::name + GXmlText::table.highlight.rowGXmlElement::name + GXmlText::table.load.fitsGXmlElement::name + GXmlText::samp.app.pingGXmlElement::name + GXmlText::coord.pointAt.skyGXmlElement::name + GXmlText::samp.hub.event.shutdownGXmlElement::name + GXmlText::image.load.fitsGXmlElement::name + GXmlText::samp.hub.disconnectGXmlElement::name + GXmlText::table.load.votableGXmlElement::name + GXmlText::samp.hub.event.unregisterGXmlElement::name GXmlText::script.aladin.send \ No newline at end of file diff --git a/src/vo/GVOApp.cpp b/src/vo/GVOApp.cpp index 5b3ab49..8618e68 100644 --- a/src/vo/GVOApp.cpp +++ b/src/vo/GVOApp.cpp @@ -183,7 +183,7 @@ std::string GVOApp::print(const GChatter& chatter) const // Initialise result string std::string result; std::list temp; - temp = registered_calls; + temp = registeredMethods; // Continue only if chatter is not silent if (chatter != SILENT) { diff --git a/src/vo/GVOHub.cpp b/src/vo/GVOHub.cpp index 3fc06f2..b9caaba 100644 --- a/src/vo/GVOHub.cpp +++ b/src/vo/GVOHub.cpp @@ -227,47 +227,24 @@ void GVOHub::register_service(const GXml& xml, const socklen_t& sock) std::string msg = ""; char buffer[124]; char privatekey[124]; + char cl_id[256]; int i; - std::list::iterator q; std::string content; std::string translator = "http://localhost:8001/"; printf("Message composition\n"); + + FILE* fptr = fopen("SAMP-registered.txt", "w"); + if (fptr != NULL) { - // Add application - GVOApp new_app; - sprintf(new_app.m_id,"client-key:%d", m_nb_clients); -std::cout << "Nb. of current applications registered:" << std::endl; -std::cout << m_connected_apps.size()<< std::endl; - m_connected_apps.push_front(new_app); -std::cout << "Nb. of current applications registered:" << std::endl; -std::cout << m_connected_apps.size()<< std::endl; - - /* - GVOApp* new_app = new GVOApp(); - sprintf(new_app -> m_id,"client-key:%d",m_nb_clients); - std::cout<< "Nb. of current applications registered:" << std::endl; - std::cout<< m_connected_apps.size()<< std::endl; - m_connected_apps.push_front(new_app); - std::cout<< new_app->m_id << std::endl; - std::cout<< "Nb. of current applications registered:" << std::endl; - std::cout<< m_connected_apps.size()<< std::endl; -<<<<<<< HEAD - */ - - /* - for (int i = 0; i < m_connected_apps.size(); ++i) { - std::cout << "Displaying element of applications list:" << std::endl; - std::cout << m_connected_apps[i].print() << std::endl; - } - */ -======= ->>>>>>> parent of a9b1ce3... Hub is functionning, pb with visibility of list of apps - for( i=0,q=m_connected_apps.begin(); iprint(); - std::cout << content << std::endl; + // If successfull writes application definition + fputs ("# SAMP registered applications and Methods \n",fptr); + sprintf(cl_id,"Registered client-key:%d\n", m_nb_clients); + fputs (cl_id,fptr); } + // Closes file + fclose(fptr); + printf("Message composition 2 \n"); sprintf(buffer,"samp.self-idclient-id:%d\n",m_nb_clients); sprintf(privatekey,"samp.private-keyclient-key:%d\n",m_nb_clients); @@ -311,7 +288,29 @@ std::cout << m_connected_apps.size()<< std::endl; ***************************************************************************/ void GVOHub::unregister(const socklen_t& sock) { + /* Code to create new file with replacement to erase registered app. File output should be renamed to the original file name + string strReplace = "HELLO"; + string strNew = "GOODBYE"; + ifstream filein("filein.txt"); //File to read from + ofstream fileout("fileout.txt"); //Temporary file + if(!filein || !fileout) + { + cout << "Error opening files!" << endl; + return 1; + } + string strTemp; + //bool found = false; + while(filein >> strTemp) + { + if(strTemp == strReplace){ + strTemp = strNew; + //found = true; + } + strTemp += "\n"; + fileout << strTemp; + //if(found) break; + }*/ close(sock); return; } @@ -326,11 +325,31 @@ void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) char buffer[124]; printf("Client Metadata received\n"); // Search for metadata values to store + std::string client_calling = ""; + // Search for value of methodName + const GXmlNode* node = xml.element("methodCall", 0); + node = node->element("params", 0); + node = node->element("param", 0); + node = node->element("value", 0); + if (node != NULL) { + const GXmlText* text = static_cast((*node)[0]); + if (text != NULL) { + client_calling = text->text(); + } + } + std::cout << client_calling << std::endl; std::string client_name = get_response_value(xml, "samp.name"); - printf("\nClient Metadata : Name %s\n", client_name.c_str()); - sprintf(buffer,"Client number: %d\n",m_nb_clients); + sprintf(buffer,"\n%s metadata : Name %s\n",client_calling.c_str(),client_name.c_str()); + printf(buffer); fflush(stdout); + FILE* fptr = fopen("SAMP-registered.txt", "a"); + if (fptr != NULL) { + fputs (buffer,fptr); + } + + // Closes file + fclose(fptr); // Declare message std::string msg = ""; @@ -353,6 +372,97 @@ void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) //Return return; } + +/***********************************************************************//** + * @brief + * + * + ***************************************************************************/ +void GVOHub::set_xml_rpc_callback(const GXml& xml,const socklen_t& sock) +{ + char buffer[124]; + printf("Client callback registration\n"); + // Search for metadata values to store + std::string client_subscriptions = get_callback_port(xml, "samp.hub.setXmlrpcCallback"); + std::cout << client_subscriptions << std::endl; + + FILE* fptr = fopen("SAMP-registered.txt", "a"); + if (fptr != NULL) { + fputs (client_subscriptions.c_str(),fptr); + } + + // Closes file + fclose(fptr); + // Declare message + std::string msg = ""; + + //The hub response to rpc callback declaration has no usefull content and can be discarded by the client. + // Set methodResponse elts + msg.append("\n"); + msg.append("\n"); + msg.append("\n"); + + int length = msg.length(); + + int n = write(sock,msg.c_str(),length); + if (n < 0) { + printf("Could not write socket buffer.\n"); + std::string msg = "Could not write socket buffer."; + throw GException::invalid_value(G_HANDLE_REQUEST, msg); + } + + printf("Response message sent\n"); + //Return + return; +} +/***********************************************************************//** + * @brief + * + * + ***************************************************************************/ +void GVOHub::get_registered_clients(const GXml& xml,const socklen_t& sock) +{ + std::string buffer; + const int n = 1000; + char line[n]; + FILE* fptr = fopen("SAMP-registered.txt", "r"); + if (fptr != NULL) { + while (fgets(line, n, fptr) != NULL) { + + // Convert line to C++ string + std::string cline = std::string(line); + + // Check for secret key + if (cline.compare(0, 10, "Registered") == 0) { + buffer = gammalib::strip_chars(cline.substr(10, std::string::npos), "\r\n"); + } + } + + // Closes file + fclose(fptr); + // Declare message + std::string msg = ""; + + //The hub response to rpc callback declaration has no usefull content and can be discarded by the client. + // Set methodResponse elts + msg.append("\n"); + msg.append("\n"); + msg.append("\n"); + + int length = msg.length(); + + int n = write(sock,msg.c_str(),length); + if (n < 0) { + printf("Could not write socket buffer.\n"); + std::string msg = "Could not write socket buffer."; + throw GException::invalid_value(G_HANDLE_REQUEST, msg); + } + + printf("Response message sent\n"); + //Return + return; + } +} /***********************************************************************//** * @brief * @@ -361,43 +471,43 @@ void GVOHub::register_metadata(const GXml& xml,const socklen_t& sock) void GVOHub::declare_subscriptions(const GXml& xml,const socklen_t& sock) { std::list::iterator p; - std::list::iterator q; int i; std::ofstream myfile; std::string content; printf("Declare Subscriptions\n"); - std::list client_subscriptions = get_registrations(xml, "samp.hub.declareSubscriptions"); - for( i=0,p=client_subscriptions.begin(); ielement("params", 0)->element("param", 0)->element("value", 0); - if (ptr != NULL) { - const GXmlText* text = static_cast((*ptr)[0]); + std::string client_calling = ""; + // Search for value of methodName + const GXmlNode* node = xml.element("methodCall", 0); + node = node->element("params", 0); + node = node->element("param", 0); + node = node->element("value", 0); + if (node != NULL) { + const GXmlText* text = static_cast((*node)[0]); if (text != NULL) { - method_called = text->text(); - std::cout << "current app calling is:" << std::endl; - std::cout << method_called << std::endl; + client_calling = text->text(); } } + std::cout << client_calling << std::endl; - std::cout<< "Nb. of current applications registered:" << std::endl; - std::cout<< m_connected_apps.size()<< std::endl; - for( i=0,q=m_connected_apps.begin(); iprint(); - std::cout << content << std::endl; + std::list client_subscriptions = get_registrations(xml, "samp.hub.declareSubscriptions"); + std::string temp; + temp.append("\n"); + FILE* fptr = fopen("SAMP-registered.txt", "a"); + if (fptr != NULL) { + for( i=0,p=client_subscriptions.begin(); i\n"); msg.append("\n"); @@ -491,7 +601,7 @@ void GVOHub::init_members(void) //m_client_id.clear(); m_socket = -1; // Signals no socket m_nb_clients = 0; // No registered clients at initialization - m_connected_apps.clear(); + connected().clear(); // Return return; @@ -516,7 +626,7 @@ void GVOHub::copy_members(const GVOHub& hub) m_hub_id = hub.m_hub_id; //m_client_id = hub.m_client_id; m_socket = hub.m_socket; - m_connected_apps = hub.m_connected_apps; + connected() = hub.connected(); // Return return; @@ -694,10 +804,10 @@ void GVOHub::handle_request(const socklen_t& sock) ping_service(sock); } if (method_called.compare("samp.hub.setXmlrpcCallback") == 0) { - ping_service(sock); + set_xml_rpc_callback(xml,sock); } if (method_called.compare("samp.hub.getRegisteredClients") == 0) { - ping_service(sock); + get_registered_clients(xml, sock); } if (method_called.compare("samp.hub.getSubscribedClients") == 0) { ping_service(sock); @@ -772,7 +882,7 @@ void GVOHub::start_hub(void) // Server socket is opened. Now, bind it to the port, with family etc. if (bind(hub_socket, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) { - std::string msg = "Hub hub socket could not bind to server socket."; + std::string msg = "Hub socket could not bind to server socket."; throw GException::invalid_value(G_START_HUB, msg); } @@ -794,7 +904,8 @@ void GVOHub::start_hub(void) std::string msg = "Client connection to socket not accepted."; throw GException::invalid_value(G_START_HUB, msg); } - + //handle_request(newsocket); + // Create child process to handle the request pid = fork(); if (pid < 0) { @@ -810,6 +921,7 @@ void GVOHub::start_hub(void) close(newsocket); } + } // endwhile @@ -901,15 +1013,17 @@ std::list GVOHub::get_registrations(const GXml& xml, if (node != NULL) { int num = node->elements("member"); for (int i = 0; i < num; ++i) { - std::cout << i << std::endl; + /*std::cout << i << std::endl; std::cout << "Affichage du membre\n"; - std::cout << *(node->element("member", i)) << std::cout; + std::cout << *(node->element("member", i)) << std::cout;*/ subnode = node->element("member", i); subnode = subnode->element("name", 0); - std::cout << "\nsubnode" << std::endl; std::cout << node->element("member",i)->element("name", 0)->print(NORMAL,0) << std::cout; - value.push_front(node->element("member",i)->element("name", 0)->print(NORMAL,0)); - std::cout << "\nFin Affichage du membre\n"; + //value.push_front(node->element("member",i)->element("name", 0)->print(NORMAL,0)); + const GXmlText* text = static_cast((*subnode)[0]); + if (text != NULL) { + value.push_front(text->text()); + } } } } @@ -923,6 +1037,57 @@ std::list GVOHub::get_registrations(const GXml& xml, return value; } /***********************************************************************//** + * @brief Returns value for a SAMP client query parameter + * + * @param[in] xml client query XML document. + * @param[in] name Parameter name. + * @return Parameter value. + * + * Returns value for a SAMP client query parameter. If the specified + * parameter was not found or if the response structure is not compliant, + * an empty string is returned. + ***************************************************************************/ +std::string GVOHub::get_callback_port(const GXml& xml, + const std::string& name) const +{ + // Declare value + std::string value; + + // Search for value of specified member + const GXmlNode* node = xml.element("methodCall", 0); + const GXmlNode* subnode; + const GXmlText* subtext; + if (node != NULL) { + node = node->element("params", 0); + if (node != NULL) { + subnode = node->element("param", 0); + if (subnode != NULL) { + subnode = subnode->element("value", 0); + if (subnode != NULL) { + const GXmlText* text = static_cast((*subnode)[0]); + if (text != NULL) { + value = text->text(); + value.append(" port : "); + } + } + } + subnode = node->element("param", 1); + if (subnode != NULL) { + subnode = subnode->element("value", 0); + if (subnode != NULL) { + const GXmlText* text = static_cast((*subnode)[0]); + if (text != NULL) { + value.append(text->text()); + } + } + } + } + } + + // Return value + return value; +} +/***********************************************************************//** * @brief Extract name / value pair from XML node * * @param[in] node Pointer to XML node.