//-------------------------- partitionNavGraph ----------------------------- //----------------------------------------------------------------------------- void GameMap::partitionNavGraph() { CCLOG("graph : %d %d %d", Prm.NumCellsX, Prm.NumCellsY, _nav_graph->numNodes()); _graph_cell_space.reset(new GraphCellSpace( _sizeX, _sizeY, Prm.NumCellsX, Prm.NumCellsY, _nav_graph->numNodes())); //add the graph nodes to the space partition NavGraph::NodeIterator node_iter(*_nav_graph); for (NavGraph::Node* node = node_iter.begin(); !node_iter.end(); node = node_iter.next()) { _graph_cell_space->addEntity(node); } }
static gboolean update_location_from_msg (GabbleConnection *conn, TpHandle contact, LmMessage *msg) { LmMessageNode *node; GHashTable *location = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_free, (GDestroyNotify) tp_g_value_slice_free); TpHandleRepoIface *contact_repo = tp_base_connection_get_handles ( (TpBaseConnection *) conn, TP_HANDLE_TYPE_CONTACT); const gchar *from = tp_handle_inspect (contact_repo, contact); NodeIter i; const gchar *lang; node = lm_message_node_find_child (wocky_stanza_get_top_node (msg), "geoloc"); if (node == NULL) return FALSE; DEBUG ("LocationsUpdate for %s:", from); lang = lm_message_node_get_attribute (node, "xml:lang"); if (lang != NULL) { g_hash_table_insert (location, g_strdup ("language"), tp_g_value_slice_new_string (lang)); } build_mapping_tables (); for (i = node_iter (node); i; i = node_iter_next (i)) { LmMessageNode *subloc_node = node_iter_data (i); GValue *value = NULL; gchar *xmpp_name; const gchar *str; LocationMapping *mapping; xmpp_name = subloc_node->name; str = lm_message_node_get_value (subloc_node); if (str == NULL) continue; mapping = g_hash_table_lookup (xmpp_to_tp, xmpp_name); if (mapping == NULL) { DEBUG ("Unknown location attribute: %s\n", xmpp_name); continue; } if (mapping->type == G_TYPE_DOUBLE) { gdouble double_value; gchar *end; double_value = g_ascii_strtod (str, &end); if (end == str) continue; value = tp_g_value_slice_new_double (double_value); DEBUG ("\t - %s: %f", xmpp_name, double_value); } else if (strcmp (xmpp_name, "timestamp") == 0) { GTimeVal timeval; if (g_time_val_from_iso8601 (str, &timeval)) { value = tp_g_value_slice_new_int64 (timeval.tv_sec); DEBUG ("\t - %s: %s", xmpp_name, str); } else { DEBUG ("\t - %s: %s: unknown date format", xmpp_name, str); continue; } } else if (mapping->type == G_TYPE_STRING) { value = tp_g_value_slice_new_string (str); DEBUG ("\t - %s: %s", xmpp_name, str); } else { g_assert_not_reached (); } g_hash_table_insert (location, g_strdup (mapping->tp_name), value); } tp_svc_connection_interface_location_emit_location_updated (conn, contact, location); gabble_presence_cache_update_location (conn->presence_cache, contact, location); return TRUE; }
static void parse_candidates (GabbleJingleTransportIface *obj, LmMessageNode *transport_node, GError **error) { GabbleJingleTransportRawUdp *t = GABBLE_JINGLE_TRANSPORT_RAWUDP (obj); GabbleJingleTransportRawUdpPrivate *priv = t->priv; GList *candidates = NULL; NodeIter i; DEBUG ("called"); if (priv->remote_candidates != NULL) { DEBUG ("already have raw udp candidates, ignoring extra ones"); return; } for (i = node_iter (transport_node); i; i = node_iter_next (i)) { LmMessageNode *node = node_iter_data (i); const gchar *id, *ip, *str; guint port, gen, component = 1; JingleCandidate *c; if (tp_strdiff (node->name, "candidate")) continue; str = lm_message_node_get_attribute (node, "component"); if (str != NULL) component = atoi (str); if ((component != 1) && (component != 2)) { DEBUG ("Ignoring non-RTP/RTCP component %d", component); continue; } id = lm_message_node_get_attribute (node, "id"); if (id == NULL) break; ip = lm_message_node_get_attribute (node, "ip"); if (ip == NULL) break; str = lm_message_node_get_attribute (node, "port"); if (str == NULL) break; port = atoi (str); str = lm_message_node_get_attribute (node, "generation"); if (str == NULL) break; gen = atoi (str); c = jingle_candidate_new (JINGLE_TRANSPORT_PROTOCOL_UDP, JINGLE_CANDIDATE_TYPE_LOCAL, id, component, ip, port, gen, 1.0, NULL, NULL, 0); candidates = g_list_append (candidates, c); } if (i != NULL) { DEBUG ("not all nodes were processed, reporting error"); /* rollback these */ jingle_transport_free_candidates (candidates); g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, "invalid candidate"); return; } DEBUG ("emitting %d new remote candidates", g_list_length (candidates)); g_signal_emit (obj, signals[NEW_CANDIDATES], 0, candidates); priv->remote_candidates = candidates; }
static void parse_candidates (GabbleJingleTransportIface *obj, LmMessageNode *transport_node, GError **error) { GabbleJingleTransportGoogle *t = GABBLE_JINGLE_TRANSPORT_GOOGLE (obj); GabbleJingleTransportGooglePrivate *priv = t->priv; GList *candidates = NULL; NodeIter i; for (i = node_iter (transport_node); i; i = node_iter_next (i)) { LmMessageNode *node = node_iter_data (i); const gchar *name, *address, *user, *pass, *str; guint port, net, gen, component; int pref; JingleTransportProtocol proto; JingleCandidateType ctype; JingleCandidate *c; if (tp_strdiff (lm_message_node_get_name (node), "candidate")) continue; name = lm_message_node_get_attribute (node, "name"); if (name == NULL) break; if (!g_hash_table_lookup_extended (priv->component_names, name, NULL, NULL)) { DEBUG ("component name %s unknown to this transport", name); continue; } component = GPOINTER_TO_INT (g_hash_table_lookup (priv->component_names, name)); address = lm_message_node_get_attribute (node, "address"); if (address == NULL) break; str = lm_message_node_get_attribute (node, "port"); if (str == NULL) break; port = atoi (str); str = lm_message_node_get_attribute (node, "protocol"); if (str == NULL) break; if (!tp_strdiff (str, "udp")) { proto = JINGLE_TRANSPORT_PROTOCOL_UDP; } else if (!tp_strdiff (str, "tcp")) { /* candiates on port 443 must be "ssltcp" */ if (port == 443) break; proto = JINGLE_TRANSPORT_PROTOCOL_TCP; } else if (!tp_strdiff (str, "ssltcp")) { /* "ssltcp" must use port 443 */ if (port != 443) break; /* we really don't care about "ssltcp" otherwise */ proto = JINGLE_TRANSPORT_PROTOCOL_TCP; } else { /* unknown protocol */ DEBUG ("unknown protocol: %s", str); break; } str = lm_message_node_get_attribute (node, "preference"); if (str == NULL) break; pref = g_ascii_strtod (str, NULL) * 65536; str = lm_message_node_get_attribute (node, "type"); if (str == NULL) break; if (!tp_strdiff (str, "local")) { ctype = JINGLE_CANDIDATE_TYPE_LOCAL; } else if (!tp_strdiff (str, "stun")) { ctype = JINGLE_CANDIDATE_TYPE_STUN; } else if (!tp_strdiff (str, "relay")) { ctype = JINGLE_CANDIDATE_TYPE_RELAY; } else { /* unknown candidate type */ DEBUG ("unknown candidate type: %s", str); break; } user = lm_message_node_get_attribute (node, "username"); if (user == NULL) break; pass = lm_message_node_get_attribute (node, "password"); if (pass == NULL) break; str = lm_message_node_get_attribute (node, "network"); if (str == NULL) break; net = atoi (str); str = lm_message_node_get_attribute (node, "generation"); if (str == NULL) break; gen = atoi (str); str = lm_message_node_get_attribute (node, "component"); if (str != NULL) component = atoi (str); c = jingle_candidate_new (proto, ctype, NULL, component, address, port, gen, pref, user, pass, net); candidates = g_list_append (candidates, c); } if (i != NULL) { DEBUG ("not all nodes were processed, reporting error"); /* rollback these */ jingle_transport_free_candidates (candidates); SET_BAD_REQ ("invalid candidate"); return; } DEBUG ("emitting %d new remote candidates", g_list_length (candidates)); g_signal_emit (obj, signals[NEW_CANDIDATES], 0, candidates); /* append them to the known remote candidates */ priv->remote_candidates = g_list_concat (priv->remote_candidates, candidates); }