void LM::Presentity::edit_presentity_form_submitted (bool submitted, Ekiga::Form& result) { if (!submitted) return; const std::string name = result.text ("name"); const std::set<std::string> groups = result.editable_set ("groups"); LmMessage* message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); LmMessageNode* query = lm_message_node_add_child (lm_message_get_node (message), "query", NULL); lm_message_node_set_attribute (query, "xmlns", "jabber:iq:roster"); LmMessageNode* node = lm_message_node_add_child (query, "item", NULL); { gchar* escaped = g_markup_escape_text (name.c_str (), -1); lm_message_node_set_attributes (node, "jid", get_jid ().c_str (), "name", escaped, NULL); g_free (escaped); } for (std::set<std::string>::const_iterator iter = groups.begin (); iter != groups.end (); ++iter) { gchar* escaped = g_markup_escape_text (iter->c_str (), -1); lm_message_node_add_child (node, "group", escaped); g_free (escaped); } lm_connection_send_with_reply (connection, message, build_message_handler (boost::bind(&LM::Presentity::handle_edit_reply, this, _1, _2)), NULL); lm_message_unref (message); }
void RL::Presentity::edit_presentity_form_submitted (bool submitted, Ekiga::Form &result) { if (!submitted) return; const std::string new_name = result.text ("name"); const std::string new_uri = result.text ("uri"); const std::set<std::string> new_groups = result.editable_set ("groups"); std::map<std::string, xmlNodePtr> future_group_nodes; xmlNsPtr ns = xmlSearchNsByHref (node->doc, node, BAD_CAST "http://www.ekiga.org"); bool reload = false; robust_xmlNodeSetContent (node, &name_node, "name", new_name); if (uri != new_uri) { xmlSetProp (node, (const xmlChar*)"uri", (const xmlChar*)uri.c_str ()); boost::shared_ptr<Ekiga::PresenceCore> presence_core(services.get<Ekiga::PresenceCore> ("presence-core")); presence_core->unfetch_presence (uri); reload = true; } for (std::map<std::string, xmlNodePtr>::const_iterator iter = group_nodes.begin (); iter != group_nodes.end () ; iter++) { if (new_groups.find (iter->first) == new_groups.end ()) { xmlUnlinkNode (iter->second); xmlFreeNode (iter->second); } else { future_group_nodes[iter->first] = iter->second; } } for (std::set<std::string>::const_iterator iter = new_groups.begin (); iter != new_groups.end (); iter++) { if (std::find (groups.begin (), groups.end (), *iter) == groups.end ()) future_group_nodes[*iter] = xmlNewChild (node, ns, BAD_CAST "group", BAD_CAST robust_xmlEscape (node->doc, *iter).c_str ()); } group_nodes = future_group_nodes; groups = new_groups; save (reload); }
void Local::Heap::new_presentity_form_submitted (bool submitted, Ekiga::Form &result) { if (!submitted) return; gmref_ptr<Ekiga::PresenceCore> presence_core = core.get ("presence-core"); const std::string name = result.text ("name"); const std::string good_uri = result.hidden ("good-uri"); std::string uri; const std::set<std::string> groups = result.editable_set ("groups"); if (good_uri == "yes") uri = result.hidden ("uri"); else uri = result.text ("uri"); size_t pos = uri.find_first_of (' '); if (pos != std::string::npos) uri = uri.substr (0, pos); if (presence_core->is_supported_uri (uri) && !has_presentity_with_uri (uri)) { add (name, uri, groups); save (); } else { Ekiga::FormRequestSimple request(sigc::mem_fun (this, &Local::Heap::new_presentity_form_submitted)); result.visit (request); if (!presence_core->is_supported_uri (uri)) request.error (_("You supplied an unsupported address")); else request.error (_("You already have a contact with this address!")); if (!questions.handle_request (&request)) { // FIXME: better error handling #ifdef __GNUC__ std::cout << "Unhandled form request in " << __PRETTY_FUNCTION__ << std::endl; #endif } } }
void Local::Heap::new_presentity_form_submitted (bool submitted, Ekiga::Form &result) { if (!submitted) return; boost::shared_ptr<Ekiga::PresenceCore> pcore = presence_core.lock (); if (!pcore) return; const std::string name = result.text ("name"); const std::string good_uri = result.hidden ("good-uri"); std::string uri; const std::set<std::string> groups = result.editable_set ("groups"); if (good_uri == "yes") uri = result.hidden ("uri"); else uri = result.text ("uri"); uri = canonize_uri (uri); if (pcore->is_supported_uri (uri) && !has_presentity_with_uri (uri)) { add (name, uri, groups); save (); } else { boost::shared_ptr<Ekiga::FormRequestSimple> request = boost::shared_ptr<Ekiga::FormRequestSimple>(new Ekiga::FormRequestSimple (boost::bind (&Local::Heap::new_presentity_form_submitted, this, _1, _2))); result.visit (*request); if (!pcore->is_supported_uri (uri)) request->error (_("You supplied an unsupported address")); else request->error (_("You already have a contact with this address!")); questions (request); } }
void LM::HeapRoster::add_item_form_submitted (bool submitted, Ekiga::Form& result) { if ( !submitted) return; const std::string jid = result.text ("jid"); const std::string contact_name = result.text ("name"); const std::list<std::string> groups = result.editable_set ("groups"); if ( !jid.empty ()) { LmMessage* message = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); LmMessageNode* query = lm_message_node_add_child (lm_message_get_node (message), "query", NULL); lm_message_node_set_attribute (query, "xmlns", "jabber:iq:roster"); LmMessageNode* node = lm_message_node_add_child (query, "item", NULL); lm_message_node_set_attributes (node, "jid", jid.c_str (), NULL); if ( !contact_name.empty ()) { gchar* escaped = g_markup_escape_text (contact_name.c_str (), -1); lm_message_node_set_attributes (node, "name", escaped, NULL); } for (std::list<std::string>::const_iterator iter = groups.begin (); iter != groups.end (); ++iter) { gchar* escaped = g_markup_escape_text (iter->c_str (), -1); lm_message_node_add_child (node, "group", escaped); g_free (escaped); } items_added_by_me.insert (jid); lm_connection_send (connection, message, NULL); lm_message_unref (message); } }
void RL::Heap::on_new_entry_form_submitted (bool submitted, Ekiga::Form& result) { if (!submitted) return; std::string entry_name = result.text ("name"); std::string entry_uri = result.text ("uri"); std::set<std::string> entry_groups = result.editable_set ("groups"); xmlNodePtr entry_node = xmlNewChild (list_node, NULL, BAD_CAST "entry", NULL); xmlSetProp (entry_node, BAD_CAST "uri", BAD_CAST robust_xmlEscape (doc.get (), entry_uri).c_str ()); xmlNewChild (entry_node, NULL, BAD_CAST "display-name", BAD_CAST robust_xmlEscape (doc.get (), entry_name).c_str ()); xmlNsPtr ns = xmlSearchNsByHref (doc.get (), entry_node, BAD_CAST "http://www.ekiga.org"); if (ns == NULL) { // FIXME: we should handle the case, even if it shouldn't happen } for (std::set<std::string>::const_iterator iter = entry_groups.begin (); iter != entry_groups.end (); ++iter) { xmlNewChild (entry_node, ns, BAD_CAST "group", BAD_CAST robust_xmlEscape (doc.get (), *iter).c_str ()); } xmlBufferPtr buffer = xmlBufferCreate (); int res = xmlNodeDump (buffer, doc.get (), entry_node, 0, 0); if (res >= 0) { std::string root_str; std::string username_str; std::string password_str; std::string user_str; { xmlChar* str = xmlNodeGetContent (root); if (str != NULL) root_str = (const char*)str; } { xmlChar* str = xmlNodeGetContent (user); if (str != NULL) user_str = (const char*)str; } { xmlChar* str = xmlNodeGetContent (username); if (str != NULL) username_str = (const char*)str; } { xmlChar* str = xmlNodeGetContent (password); if (str != NULL) password_str = (const char*)str; } gmref_ptr<XCAP::Path> path(new XCAP::Path (root_str, "resource-lists", user_str)); path->set_credentials (username_str, password_str); path = path->build_child ("resource-lists"); path = path->build_child ("list"); path = path->build_child_with_attribute ("entry", "uri", entry_uri); gmref_ptr<XCAP::Core> xcap(services.get ("xcap-core")); xcap->write (path, "application/xcap-el+xml", (const char*)xmlBufferContent (buffer), sigc::mem_fun (this, &RL::Heap::new_entry_result)); } xmlBufferFree (buffer); }
void Local::Presentity::edit_presentity_form_submitted (bool submitted, Ekiga::Form &result) { if (!submitted) return; const std::string new_name = result.text ("name"); const std::set<std::string> groups = get_groups (); const std::set<std::string> new_groups = result.editable_set ("groups"); std::string new_uri = result.text ("uri"); const std::string uri = get_uri (); bool preferred = result.boolean ("preferred"); std::set<xmlNodePtr> nodes_to_remove; new_uri = canonize_uri (new_uri); for (xmlNodePtr child = node->children ; child != NULL ; child = child->next) { if (child->type == XML_ELEMENT_NODE && child->name != NULL) { if (xmlStrEqual (BAD_CAST ("name"), child->name)) { robust_xmlNodeSetContent (node, &child, "name", new_name); } } } if (uri != new_uri) { boost::shared_ptr<Ekiga::PresenceCore> pcore = presence_core.lock (); if (pcore) { pcore->unfetch_presence (uri); pcore->fetch_presence (new_uri); } presence = "unknown"; xmlSetProp (node, (const xmlChar*)"uri", (const xmlChar*)new_uri.c_str ()); } // the first loop looks at groups we were in : are we still in ? for (xmlNodePtr child = node->children ; child != NULL ; child = child->next) { if (child->type == XML_ELEMENT_NODE && child->name != NULL) { if (xmlStrEqual (BAD_CAST ("group"), child->name)) { xmlChar* xml_str = xmlNodeGetContent (child); if (xml_str != NULL) { if (new_groups.find ((const char*) xml_str) == new_groups.end ()) { nodes_to_remove.insert (child); // don't free what we loop on! } xmlFree (xml_str); } } } } // ok, now we can clean up! for (std::set<xmlNodePtr>::iterator iter = nodes_to_remove.begin (); iter != nodes_to_remove.end (); ++iter) { xmlUnlinkNode (*iter); xmlFreeNode (*iter); } // the second loop looking for groups we weren't in but are now for (std::set<std::string>::const_iterator iter = new_groups.begin (); iter != new_groups.end (); iter++) { if (std::find (groups.begin (), groups.end (), *iter) == groups.end ()) { xmlNewChild (node, NULL, BAD_CAST "group", BAD_CAST robust_xmlEscape (node->doc, *iter).c_str ()); } } if (preferred) { xmlSetProp (node, BAD_CAST "preferred", BAD_CAST "true"); } else { xmlSetProp (node, BAD_CAST "preferred", BAD_CAST "false"); } updated (); trigger_saving (); }