in chime/chime-connection.c [399:481]
static gboolean parse_regnode(ChimeConnection *self, JsonNode *regnode)
{
ChimeConnectionPrivate *priv = CHIME_CONNECTION_GET_PRIVATE (self);
JsonObject *obj = json_node_get_object(priv->reg_node);
JsonNode *node, *sess_node = json_object_get_member(obj, "Session");
const gchar *sess_tok;
char *express_url, *p;
if (!sess_node)
return FALSE;
if (!parse_string(sess_node, "SessionToken", &sess_tok))
return FALSE;
chime_connection_set_session_token(self, sess_tok);
if (!parse_string(sess_node, "SessionId", &priv->session_id))
return FALSE;
obj = json_node_get_object(sess_node);
node = json_object_get_member(obj, "Profile");
if (!parse_string(node, "profile_channel", &priv->profile_channel) ||
!parse_string(node, "presence_channel", &priv->presence_channel) ||
!parse_string(node, "id", &priv->profile_id) ||
!parse_string(node, "display_name", &priv->display_name) ||
!parse_string(node, "email", &priv->email))
return FALSE;
node = json_object_get_member(obj, "Device");
if (!parse_string(node, "DeviceId", &priv->device_id) ||
!parse_string(node, "Channel", &priv->device_channel))
return FALSE;
node = json_object_get_member(obj, "ServiceConfig");
if (!node)
return FALSE;
obj = json_node_get_object(node);
node = json_object_get_member(obj, "Presence");
if (!parse_string(node, "RestUrl", &priv->presence_url))
return FALSE;
node = json_object_get_member(obj, "Push");
if (!parse_string(node, "ReachabilityUrl", &priv->reachability_url) ||
!parse_string(node, "WebsocketUrl", &priv->websocket_url))
return FALSE;
node = json_object_get_member(obj, "Profile");
if (!parse_string(node, "RestUrl", &priv->profile_url))
return FALSE;
node = json_object_get_member(obj, "Contacts");
if (!parse_string(node, "RestUrl", &priv->contacts_url))
return FALSE;
node = json_object_get_member(obj, "Messaging");
if (!parse_string(node, "RestUrl", &priv->messaging_url))
return FALSE;
node = json_object_get_member(obj, "Presence");
if (!parse_string(node, "RestUrl", &priv->presence_url))
return FALSE;
node = json_object_get_member(obj, "Conference");
if (!parse_string(node, "RestUrl", &priv->conference_url))
return FALSE;
node = json_object_get_member(obj, "Feature");
if (!parse_string(node, "RestUrl", &priv->feature_url))
return FALSE;
/* Ick. How are we supposed to discover this? */
express_url = g_strdup(priv->feature_url);
p = strstr(express_url, "feature");
if (!p) {
g_free(express_url);
return FALSE;
}
memcpy(p, "express", 7);
priv->express_url = express_url;
return TRUE;
}