コード例 #1
0
ファイル: gwq_login.c プロジェクト: CrazyPandar/libgwebqq
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);
    }
コード例 #2
0
ファイル: push-c2dm-client.c プロジェクト: catch/postal
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;
}
コード例 #3
0
ファイル: gwq_poll.c プロジェクト: CrazyPandar/libgwebqq
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);
}