static void _process_check_resp(SoupSession *ss, SoupMessage *msg, gpointer user_data) { GWQSession *wqs; const guint8* data; gsize size; SoupBuffer *sBuf; int i; wqs = (GWQSession*)user_data; sBuf = soup_message_body_flatten(msg->response_body); GWQ_DBG("check responsed, retcode=%d, reason:%s\n", msg->status_code, msg->reason_phrase); if (sBuf) { soup_buffer_get_data(sBuf, &data, &size); GWQ_DBG("bodySize=%d\nbody:%s\n", size, data); if (size>0) { const gchar *tmpCStr, *vc, *end; tmpCStr = (const gchar*)data; end = (gchar*)(data+size-1); if (tmpCStr && (tmpCStr = g_strstr_len(tmpCStr, size, ",")) && tmpCStr < end && *(++tmpCStr) && (tmpCStr = g_strstr_len(tmpCStr, size, "'")) && tmpCStr < end && *(vc = ++tmpCStr) && (tmpCStr = g_strstr_len(tmpCStr, size, "'")) && tmpCStr < end) { g_string_assign(wqs->verifyCode, ""); g_string_append_len(wqs->verifyCode, vc, tmpCStr-vc); GWQ_DBG("vc.verifyCode: %s\n", wqs->verifyCode->str); } if (tmpCStr && (tmpCStr = g_strstr_len(tmpCStr, size, ",")) && tmpCStr < end && *(++tmpCStr) && (tmpCStr = g_strstr_len(tmpCStr, size, "'")) && tmpCStr < end && *(vc = ++tmpCStr) && (tmpCStr = g_strstr_len(tmpCStr, size, "'")) && tmpCStr < end) { g_string_assign(wqs->vcUin, ""); g_string_append_len(wqs->vcUin, vc, tmpCStr-vc); GWQ_DBG("vc.uin:%s\n", wqs->vcUin->str); wqs->vcUinAryLen = (wqs->vcUin->len)>>2; if (wqs->vcUinAryLen < sizeof(wqs->vcUinAry)) { for (i=0; i<wqs->vcUinAryLen; i++) { wqs->vcUinAry[i] = DigestCharToChar(wqs->vcUin->str[(i<<2)+2], wqs->vcUin->str[(i<<2)+3]); GWQ_DBG("%x\n", wqs->vcUinAry[i]); } } } } soup_buffer_free(sBuf); }
static void push_c2dm_client_message_cb (SoupSession *session, SoupMessage *message, gpointer user_data) { GSimpleAsyncResult *simple = user_data; PushC2dmIdentity *identity; PushC2dmClient *client = (PushC2dmClient *)session; const guint8 *data; const gchar *code_str; const gchar *registration_id; SoupBuffer *buffer; gboolean removed = FALSE; gsize length; guint code; ENTRY; g_return_if_fail(PUSH_IS_C2DM_CLIENT(client)); g_return_if_fail(SOUP_IS_MESSAGE(message)); g_return_if_fail(G_IS_SIMPLE_ASYNC_RESULT(simple)); buffer = soup_message_body_flatten(message->response_body); soup_buffer_get_data(buffer, &data, &length); if (message->status_code == SOUP_STATUS_UNAUTHORIZED) { g_simple_async_result_set_error( simple, PUSH_C2DM_CLIENT_ERROR, PUSH_C2DM_CLIENT_ERROR_UNAUTHORIZED, _("C2DM request unauthorized. Check credentials.")); GOTO(failure); } if (!g_utf8_validate((gchar *)data, length, NULL)) { g_simple_async_result_set_error(simple, PUSH_C2DM_CLIENT_ERROR, PUSH_C2DM_CLIENT_ERROR_UNKNOWN, _("Received invalid result from C2DM.")); GOTO(failure); } if (g_str_has_prefix((gchar *)data, "id=")) { g_simple_async_result_set_op_res_gboolean(simple, TRUE); } else { if (g_str_equal(data, "Error=QuotaExceeded")) { code = PUSH_C2DM_CLIENT_ERROR_QUOTA_EXCEEDED; code_str = _("Quota exceeded."); } else if (g_str_equal(data, "Error=DeviceQuotaExceeded")) { code = PUSH_C2DM_CLIENT_ERROR_DEVICE_QUOTA_EXCEEDED; code_str = _("Device quota exceeded."); } else if (g_str_equal(data, "Error=MissingRegistration")) { code = PUSH_C2DM_CLIENT_ERROR_MISSING_REGISTRATION; code_str = _("Missing registration."); removed = TRUE; } else if (g_str_equal(data, "Error=InvalidRegistration")) { code = PUSH_C2DM_CLIENT_ERROR_INVALID_REGISTRATION; code_str = _("Invalid registration."); removed = TRUE; } else if (g_str_equal(data, "Error=MismatchSenderId")) { code = PUSH_C2DM_CLIENT_ERROR_MISMATCH_SENDER_ID; code_str = _("Mismatch sender id."); } else if (g_str_equal(data, "Error=NotRegistered")) { code = PUSH_C2DM_CLIENT_ERROR_NOT_REGISTERED; code_str = _("Not registered."); removed = TRUE; } else if (g_str_equal(data, "Error=MessageTooBig")) { code = PUSH_C2DM_CLIENT_ERROR_MESSAGE_TOO_BIG; code_str = _("Message too big."); } else if (g_str_equal(data, "Error=MissingCollapseKey")) { code = PUSH_C2DM_CLIENT_ERROR_MISSING_COLLAPSE_KEY; code_str = _("Missing collapse key."); } else { code = PUSH_C2DM_CLIENT_ERROR_UNKNOWN; code_str = _("An unknown error occurred."); } g_simple_async_result_set_error(simple, PUSH_C2DM_CLIENT_ERROR, code, "%s", code_str); if (removed) { registration_id = g_object_get_data(G_OBJECT(simple), "registration-id"); identity = g_object_new(PUSH_TYPE_C2DM_IDENTITY, "registration-id", registration_id, NULL); g_signal_emit(client, gSignals[IDENTITY_REMOVED], 0, identity); g_object_unref(identity); } } failure: soup_buffer_free(buffer); g_simple_async_result_complete_in_idle(simple); g_object_unref(simple); EXIT; }
static void _process_poll_resp(SoupSession *ss, SoupMessage *msg, gpointer user_data) { GWQSession *wqs; const guint8* data; gsize size; SoupBuffer *sBuf; gchar *tmpCStr; JsonParser *jParser; JsonNode *jn; JsonObject *jo; gint32 tmpInt; SoupURI *su; JsonArray *resJa; wqs = (GWQSession*)user_data; GWQ_DBG("poll responsed, retcode=%d, reason:%s\n", msg->status_code, msg->reason_phrase); if (wqs->st != GWQS_ST_IDLE) { goto ERR_OUT; } if (msg->status_code != 200) { GWQ_ERR_OUT(ERR_OUT, "\n"); } sBuf = soup_message_body_flatten(msg->response_body); if (!sBuf) { GWQ_ERR_OUT(ERR_OUT, "\n"); } soup_buffer_get_data(sBuf, &data, &size); if (!data || size <=0 ) { GWQ_ERR_OUT(ERR_FREE_SBUF, "\n"); } GWQ_DBG("bodySize=%d\nbody:%s\n", size, data); if (!(jParser = json_parser_new())) { GWQ_ERR_OUT(ERR_FREE_SBUF, "\n"); } resJa = NULL; if (!json_parser_load_from_data(jParser, (const gchar*)data, size, NULL)) { GWQ_ERR("\n"); } else if (!(jn = json_parser_get_root(jParser)) || !(jo = json_node_get_object(jn))) { GWQ_ERR("\n"); } else if ((tmpInt = json_object_get_int_member(jo, "retcode"))) { GWQ_ERR("poll retcode=%d\n", tmpInt); } else if (!(jn = json_object_get_member(jo, "result")) || !(resJa = json_node_get_array(jn))) { GWQ_ERR("poll no result found\n"); } if (resJa) { json_array_foreach_element(resJa, _PollResultArrayForeach, wqs); } g_object_unref(jParser); soup_buffer_free(sBuf); tmpCStr = g_strdup_printf("clientid=%s&psessionid=%s&t=%ld", wqs->clientId->str, wqs->psessionid->str, GetNowMillisecond() ); su = soup_message_get_uri(msg); soup_uri_set_query(su, tmpCStr); g_free(tmpCStr); GWQ_ERR("Fix me : why soup_session_requeue_message() fails here!!!!!!!!!!!!!!!!!!!!!\n"); //soup_session_requeue_message(wqs->sps, msg); GWQSessionDoPoll(wqs); return; ERR_FREE_J_PARSER: g_object_unref(jParser); ERR_FREE_SBUF: soup_buffer_free(sBuf); ERR_OUT: soup_session_cancel_message(ss, msg, SOUP_STATUS_CANCELLED); }