/** ** Exit the game. ** ** @param err Error code to pass to shell. */ void Exit(int err) { if (GameRunning) { StopGame(GameExit); return; } StopMusic(); QuitSound(); NetworkQuitGame(); ExitNetwork1(); CleanModules(); FreeBurningBuildingFrames(); FreeSounds(); FreeGraphics(); FreePlayerColors(); FreeButtonStyles(); FreeAllContainers(); freeGuichan(); DebugPrint("Frames %lu, Slow frames %d = %ld%%\n" _C_ FrameCounter _C_ SlowFrameCounter _C_ (SlowFrameCounter * 100) / (FrameCounter ? FrameCounter : 1)); lua_settop(Lua, 0); lua_close(Lua); DeInitVideo(); #ifdef USE_PHYSFS if (PHYSFS_isInit()) { PHYSFS_deinit(); } #endif fprintf(stdout, "%s", _("Thanks for playing Stratagus.\n")); exit(err); }
static void login_stage_3(LwqqAsyncEvent* ev) { if(lwqq_async_event_get_code(ev) == LWQQ_CALLBACK_FAILED) return; int err = lwqq_async_event_get_result(ev); LwqqClient* lc = lwqq_async_event_get_owner(ev); if(!lwqq_client_valid(lc)) return; switch (err) { case LWQQ_EC_LOGIN_NEED_VC: lwqq_log(LOG_WARNING, "Need to enter verify code\n"); LwqqAsyncEvent* ev = get_verify_image(lc); lwqq_async_add_event_listener(ev,_C_(p,lc->async_opt->login_verify,lc)); return ; case LWQQ_EC_NETWORK_ERROR: lwqq_log(LOG_ERROR, "Network error\n"); lc->async_opt->login_complete(lc,err); return ; case LWQQ_EC_OK: lwqq_log(LOG_DEBUG, "Get verify code OK\n"); break; default: lwqq_log(LOG_ERROR, "Unknown error\n"); lc->async_opt->login_complete(lc,err); return ; } login_stage_4(lc); }
/** * WebQQ login function * Step: * 1. Get webqq version * 2. Get verify code * 3. Calculate password's md5 * 4. Do real login * 5. check whether logining successfully * * @param client Lwqq Client * @param err Error code */ LWQQ_EXPORT void lwqq_login(LwqqClient *client, LwqqStatus status,LwqqErrorCode *err) { if (!client) { lwqq_log(LOG_ERROR, "Invalid pointer\n"); return ; } if(status == LWQQ_STATUS_LOGOUT || status == LWQQ_STATUS_OFFLINE){ lwqq_log(LOG_WARNING, "Invalid online status\n"); return; } client->stat = status; client->args->login_ec = LWQQ_EC_NO_RESULT; vp_do_repeat(client->events->start_login, NULL); /* optional: get webqq version */ //get_version(client, err); if(!client->vc){ LwqqAsyncEvent* ev = get_login_sig(client); lwqq_async_add_event_listener(ev, _C_(2p,login_stage_2,client,err)); }else{ login_stage_4(client,err); } }
static void upload_offline_file_init(PurpleXfer* xfer) { qq_account* ac = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account)); LwqqClient* lc = ac->qq; const char* serv_id; if(ac->flag&QQ_USE_QQNUM){ const char* qqnum = purple_xfer_get_remote_user(xfer); LwqqBuddy* b = find_buddy_by_qqnumber(ac->qq, qqnum); if(b == NULL) return; serv_id = b->uin; }else{ serv_id = purple_xfer_get_remote_user(xfer); } LwqqMsgOffFile* file = lwqq_msg_fill_upload_offline_file( xfer->local_filename, lc->myself->uin, serv_id); xfer->start_time = time(NULL); xfer->data = file; int flags = 0; if(ac->flag&QQ_DONT_EXPECT_100_CONTINUE) flags |= DONT_EXPECTED_100_CONTINUE; LwqqAsyncEvent* ev = lwqq_msg_upload_offline_file(lc,file,flags); lwqq_async_add_event_listener(ev,_C_(2p,send_file,ev,xfer)); LwqqHttpRequest* req = lwqq_async_event_get_conn(ev); lwqq_http_on_progress(req, file_trans_on_progress, xfer); lwqq_http_set_option(req, LWQQ_HTTP_CANCELABLE,1L); }
static void login_stage_3(LwqqAsyncEvent* ev,LwqqErrorCode* ec) { if(lwqq_async_event_get_code(ev) == LWQQ_CALLBACK_FAILED) return; int err = lwqq_async_event_get_result(ev); if(ec) *ec=err; LwqqClient* lc = lwqq_async_event_get_owner(ev); if(!lwqq_client_valid(lc)) return; switch (err) { case LWQQ_EC_LOGIN_NEED_VC: lwqq_log(LOG_WARNING, "Need to enter verify code\n"); lc->vc->cmd = _C_(2p,login_stage_4,lc,ec); get_verify_image(lc); return ; case LWQQ_EC_NETWORK_ERROR: lwqq_log(LOG_ERROR, "Network error\n"); lc->stat = LWQQ_STATUS_LOGOUT; lc->args->login_ec = err; vp_do_repeat(lc->events->login_complete, NULL); return ; case LWQQ_EC_OK: lwqq_log(LOG_DEBUG, "Get verify code OK\n"); break; default: lwqq_log(LOG_ERROR, "Unknown error\n"); lc->stat = LWQQ_STATUS_LOGOUT; lc->args->login_ec = err; vp_do_repeat(lc->events->login_complete, NULL); return ; } login_stage_4(lc,ec); }
/** ** Exit the game. ** ** @param err Error code to pass to shell. */ void Exit(int err) { if (GameRunning) { StopGame(GameExit); return; } StopMusic(); QuitSound(); NetworkQuit(); ExitNetwork1(); #ifdef DEBUG CleanModules(); FreeBurningBuildingFrames(); FreeSounds(); FreeGraphics(); FreePlayerColors(); FreeButtonStyles(); for (size_t i = 0; i < Containers.size(); ++i) { delete Containers[i]; } freeGuichan(); DebugPrint("Frames %lu, Slow frames %d = %ld%%\n" _C_ FrameCounter _C_ SlowFrameCounter _C_ (SlowFrameCounter * 100) / (FrameCounter ? FrameCounter : 1)); lua_settop(Lua, 0); lua_close(Lua); DeInitVideo(); #endif fprintf(stdout, "%s", _("Thanks for playing Stratagus.\n")); exit(err); }
static void login_stage_2(LwqqAsyncEvent* ev) { if(lwqq_async_event_get_code(ev) == LWQQ_CALLBACK_FAILED) return; LwqqClient* lc = lwqq_async_event_get_owner(ev); if(!lwqq_client_valid(lc)) return; int err = lwqq_async_event_get_result(ev); if (err) { lwqq_log(LOG_ERROR, "Get webqq version error\n"); lc->async_opt->login_complete(lc,err); return ; } lwqq_log(LOG_NOTICE, "Get webqq version: %s\n", lc->version); /** * Second, we get the verify code from server. * If server provide us a image and let us enter code shown * in image number, in this situation, we just return LWQQ_EC_LOGIN_NEED_VC * simply, so user should call lwqq_login() again after he set correct * code to vc->str; * Else, if we can get the code directly, do login immediately. * */ if (!lc->vc) { LwqqAsyncEvent* ev = get_verify_code(lc,APPID); lwqq_async_add_event_listener(ev,_C_(p,login_stage_3,ev)); return; } login_stage_4(lc); }
/** * Do really login * * @param lc * @param md5 The md5 calculated from calculate_password_md5() * @param err */ static LwqqAsyncEvent* do_login(LwqqClient *lc, const char *md5, LwqqErrorCode *err) { char url[1024]; char refer[1024]; LwqqHttpRequest *req; snprintf(url, sizeof(url), WEBQQ_LOGIN_HOST"/login?" "u=%s&p=%s&verifycode=%s&" "webqq_type=%d&remember_uin=1&aid=1003903&login2qq=1&" "u1=http%%3A%%2F%%2Fweb.qq.com%%2Floginproxy.html" "%%3Flogin2qq%%3D1%%26webqq_type%%3D10&h=1&ptredirect=0&" "ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&" "action=2-10-5837&mibao_css=m_webqq&t=1&g=1&js_type=0&js_ver=10034&login_sig=%s", lc->username, md5, lc->vc->str,lc->stat,lc->login_sig); req = lwqq_http_create_default_request(lc,url, err); /* Setup http header */ req->set_header(req, "Referer", WEBQQ_LOGIN_LONG_REF_URL(refer)); LwqqAsyncEvent* ret = lwqq_async_event_new(NULL); /* Send request */ LwqqAsyncEvent* ev = req->do_request_async(req, lwqq__hasnot_post(),_C_(2p_i,do_login_back,req,ret)); lwqq_async_add_event_chain(ev,ret); return ret; }
static LwqqAsyncEvent* get_version(LwqqClient *lc, LwqqErrorCode *err) { LwqqHttpRequest *req; req = lwqq_http_create_default_request(lc,WEBQQ_VERSION_URL, err); /* Send request */ lwqq_log(LOG_DEBUG, "Get webqq version from %s\n", WEBQQ_VERSION_URL); return req->do_request_async(req, 0, NULL,_C_(p_i,get_version_back,req)); }
static void upload_offline_file_init(PurpleXfer* xfer) { qq_account* ac = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account)); LwqqClient* lc = ac->qq; LwqqMsgOffFile* file = lwqq_msg_fill_upload_offline_file( xfer->local_filename, lc->myself->uin, purple_xfer_get_remote_user(xfer)); xfer->start_time = time(NULL); xfer->data = file; LwqqAsyncEvent* ev = lwqq_msg_upload_offline_file(lc,file); lwqq_async_add_event_listener(ev,_C_(2p,send_file,ev,xfer)); lwqq_async_event_set_progress(ev, file_trans_on_progress, xfer); }
static LwqqAsyncEvent* get_login_sig(LwqqClient* lc) { char url[512]; snprintf(url,sizeof(url),WEBQQ_LOGIN_UI_HOST"/cgi-bin/login" "?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903" "&enable_qlogin=0&s_url=http%%3A%%2F%%2Fweb2.qq.com%%2Floginproxy.html" ); LwqqHttpRequest* req = lwqq_http_create_default_request(lc, url, NULL); lwqq_http_set_option(req, LWQQ_HTTP_TIMEOUT,5); lwqq_http_set_option(req, LWQQ_HTTP_TIMEOUT_INCRE,5); return req->do_request_async(req,lwqq__hasnot_post(),_C_(p_i,get_login_sig_back,req)); }
LwqqAsyncEvent* lwqq_get_version(LwqqClient *lc, LwqqErrorCode *err) { LwqqHttpRequest *req; const char* url = WEBQQ_VERSION_URL; req = lwqq_http_create_default_request(lc,url , err); lwqq_http_set_option(req, LWQQ_HTTP_ALL_TIMEOUT,5L); /* Send request */ lwqq_log(LOG_DEBUG, "Get webqq version from %s\n", WEBQQ_VERSION_URL); return req->do_request_async(req, lwqq__hasnot_post(),_C_(p_i,get_version_back,req)); }
static void login_stage_4(LwqqClient* lc) { if(!lwqq_client_valid(lc)) return; /* Third: calculate the md5 */ char *md5 = lwqq_enc_pwd(lc->password, lc->vc->str, lc->vc->uin); /* Last: do real login */ LwqqAsyncEvent* ev = do_login(lc, md5, NULL); s_free(md5); lwqq_async_add_event_listener(ev,_C_(p,login_stage_5,ev)); }
static int file_trans_on_progress(void* data,size_t now,size_t total) { PurpleXfer* xfer = data; if(purple_xfer_is_canceled(xfer)||purple_xfer_is_completed(xfer)) { return 1; } purple_xfer_set_size(xfer,total); xfer->bytes_sent = now; xfer->bytes_remaining = total-now; qq_dispatch(_C_(p,purple_xfer_update_progress,xfer),10); return 0; }
static LwqqAsyncEvent* get_verify_image(LwqqClient *lc) { LwqqHttpRequest *req = NULL; char url[512]; char chkuin[64]; LwqqErrorCode err; snprintf(url, sizeof(url), WEBQQ_CAPTCHA_HOST"/getimage?aid=%s&uin=%s", APPID, lc->username); req = lwqq_http_create_default_request(lc,url, &err); snprintf(chkuin, sizeof(chkuin), "chkuin=%s", lc->username); req->set_header(req, "Cookie", chkuin); return req->do_request_async(req, lwqq__hasnot_post(),_C_(2p_i,request_captcha_back,req,lc->vc)); }
static void login_stage_5(LwqqAsyncEvent* ev) { if(lwqq_async_event_get_code(ev) == LWQQ_CALLBACK_FAILED) return; int err = lwqq_async_event_get_result(ev); LwqqClient* lc = lwqq_async_event_get_owner(ev); if(!lwqq_client_valid(lc)) return; /* Free old value */ if(err != LWQQ_EC_OK){ lc->async_opt->login_complete(lc,err); } LwqqAsyncEvent* event = set_online_status(lc, lwqq_status_to_str(lc->stat)); lwqq_async_add_event_listener(event,_C_(p,login_stage_f,event)); }
/** * WebQQ login function * Step: * 1. Get webqq version * 2. Get verify code * 3. Calculate password's md5 * 4. Do real login * 5. check whether logining successfully * * @param client Lwqq Client * @param err Error code */ void lwqq_login(LwqqClient *client, LwqqStatus status,LwqqErrorCode *err) { if (!client || !status) { lwqq_log(LOG_ERROR, "Invalid pointer\n"); return ; } client->stat = status; lwqq_puts("[login stage 1:get webqq version]\n"); /* First: get webqq version */ LwqqAsyncEvent* ev = get_version(client, err); lwqq_async_add_event_listener(ev,_C_(p,login_stage_2,ev)); }
static LwqqAsyncEvent* get_verify_code(LwqqClient *lc,const char* appid) { LwqqHttpRequest *req; char url[512]; char chkuin[64]; snprintf(url, sizeof(url), WEBQQ_CHECK_HOST"/check?uin=%s&appid=%s", lc->username, appid); req = lwqq_http_create_default_request(lc,url,NULL); lwqq_verbose(3,"%s\n",url); snprintf(chkuin, sizeof(chkuin), "chkuin=%s", lc->username); req->set_header(req, "Cookie", chkuin); return req->do_request_async(req, 0, NULL,_C_(p_i,get_verify_code_back,req)); }
LwqqAsyncEvent* lwqq_relogin(LwqqClient* lc) { if(!lc) return NULL; char url[128]; char post[512]; if(!lc->new_ptwebqq) lc->new_ptwebqq = s_strdup(lc->cookies->ptwebqq); snprintf(url, sizeof(url), WEBQQ_D_HOST"/channel/login2"); snprintf(post, sizeof(post), "r={\"status\":\"%s\",\"ptwebqq\":\"%s\",\"passwd_sig\":\"\",\"clientid\":\"%s\",\"psessionid\":\"%s\"}",lwqq_status_to_str(lc->stat),lc->new_ptwebqq,lc->clientid,lc->psessionid); lwqq_verbose(3,"%s\n",url); lwqq_verbose(3,"%s\n",post); LwqqHttpRequest* req = lwqq_http_create_default_request(lc, url, NULL); req->set_header(req,"Referer",WEBQQ_D_REF_URL); lwqq_set_cookie(lc->cookies, "ptwebqq", lc->new_ptwebqq); req->set_header(req,"Cookie",lwqq_get_cookies(lc)); return req->do_request_async(req,1,post,_C_(p_i,process_login2,req)); }
LwqqAsyncEvent* lwqq_relink(LwqqClient* lc) { if(!lc) return NULL; char url[128]; char post[512]; if(!lc->new_ptwebqq){ lc->new_ptwebqq = lwqq_http_get_cookie(lwqq_get_http_handle(lc), "ptwebqq"); } snprintf(url, sizeof(url), "%s/channel/login2",WEBQQ_D_HOST); snprintf(post, sizeof(post), "r={\"status\":\"%s\",\"ptwebqq\":\"%s\",\"passwd_sig\":\"\",\"clientid\":\"%s\",\"psessionid\":\"%s\"}",lwqq_status_to_str(lc->stat),lc->new_ptwebqq,lc->clientid,lc->psessionid); LwqqHttpRequest* req = lwqq_http_create_default_request(lc, url, NULL); req->set_header(req,"Referer",WEBQQ_D_REF_URL); lwqq_http_set_cookie(req, "ptwebqq", lc->new_ptwebqq); req->retry = 0; return req->do_request_async(req,lwqq__has_post(),_C_(p_i,process_login2,req)); }
LwqqAsyncEvent* lwqq__request_captcha(LwqqClient* lc,LwqqVerifyCode* c) { if(!lc||!c) return NULL; char url[512]; c->lc = lc; srand48(time(NULL)); double random = drand48(); snprintf(url,sizeof(url),"%s/getimage?" "aid=1003901&%.16lf", "http://captcha.qq.com",random); lwqq_puts(url); LwqqHttpRequest* req = lwqq_http_create_default_request(lc,url,NULL); req->set_header(req,"Referer","http://web2.qq.com/"); req->set_header(req,"Connection","keep-alive"); return req->do_request_async(req,0,NULL,_C_(2p_i,request_captcha_back,req,c)); }
static void recv_file_init(PurpleXfer* xfer) { qq_account* ac = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account)); LwqqClient* lc = ac->qq; LwqqMsgFileMessage* file = xfer->data; const char* filename = purple_xfer_get_local_filename(xfer); xfer->start_time = time(NULL); LwqqAsyncEvent* ev = lwqq_msg_accept_file(lc,file,filename); if(ev == NULL){ lwqq_puts("file trans error "); purple_xfer_error(PURPLE_XFER_RECEIVE, ac->account, purple_xfer_get_remote_user(xfer), "接受文件失败"); purple_xfer_cancel_local(xfer); return; } lwqq_async_event_set_progress(ev,file_trans_on_progress,xfer); lwqq_async_add_event_listener(ev,_C_(p,recv_file_complete,xfer)); }
static void login_stage_5(LwqqAsyncEvent* ev,LwqqErrorCode* ec) { if(lwqq_async_event_get_code(ev) == LWQQ_CALLBACK_FAILED) return; int err = lwqq_async_event_get_result(ev); if(ec)(*ec=err); LwqqClient* lc = lwqq_async_event_get_owner(ev); if(!lwqq_client_valid(lc)) return; /* Free old value */ if(err != LWQQ_EC_OK){ lc->stat = LWQQ_STATUS_LOGOUT; lc->args->login_ec = err; vp_do_repeat(lc->events->login_complete, NULL); return; } LwqqAsyncEvent* event = set_online_status(lc, lwqq_status_to_str(lc->stat)); lwqq_async_add_event_listener(event,_C_(2p,login_stage_f,event,ec)); }
static void recv_file_init(PurpleXfer* xfer) { qq_account* ac = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account)); LwqqClient* lc = ac->qq; LwqqMsgFileMessage* file = xfer->data; const char* filename = purple_xfer_get_local_filename(xfer); xfer->start_time = time(NULL); LwqqAsyncEvent* ev = lwqq_msg_accept_file(lc,file,filename); if(ev == NULL){ lwqq_puts("file trans error "); purple_xfer_error(PURPLE_XFER_RECEIVE, ac->account, purple_xfer_get_remote_user(xfer), _("Receive file failed")); purple_xfer_cancel_local(xfer); return; } LwqqHttpRequest* req = lwqq_async_event_get_conn(ev); lwqq_http_on_progress(req, file_trans_on_progress, xfer); lwqq_http_set_option(req, LWQQ_HTTP_CANCELABLE,1L); lwqq_async_add_event_listener(ev,_C_(2p,recv_file_complete,xfer,ev)); }
static LwqqAsyncEvent* check_need_verify(LwqqClient *lc,const char* appid) { LwqqHttpRequest *req; char url[512]; char buf[256]; srand48(time(NULL)); double random = drand48(); snprintf(url, sizeof(url), WEBQQ_CHECK_HOST"/check?uin=%s&appid=%s&" "js_ver=10037&js_type=0&%s%s&u1=http%%3A%%2F%%2Fweb2.qq.com%%2Floginproxy.html&r=%.16lf", lc->username, appid, lc->login_sig?"login_sig=":"", lc->login_sig?:"", random); req = lwqq_http_create_default_request(lc,url,NULL); req->set_header(req,"Referer",WEBQQ_LOGIN_LONG_REF_URL(buf)); return req->do_request_async(req, lwqq__hasnot_post(),_C_(p_i,check_need_verify_back,req)); }
void lwqq_async_add_event_chain(LwqqAsyncEvent* caller,LwqqAsyncEvent* called) { /**indeed caller->lc may be NULL when recursor */ called->lc = caller->lc; LwqqAsyncEvent_* called_ = (LwqqAsyncEvent_*)called; //cancel previous chained event if(called_->chained){ LwqqAsyncEvent_* chained_ = (LwqqAsyncEvent_*)called_->chained; vp_cancel0(chained_->cmd); } called_->chained = caller; if(caller->failcode == LWQQ_CALLBACK_SYNCED){ //when sync enabled, caller and called must finished already. //so free caller ,and do not trigger anything called->result = caller->result; called->failcode = caller->failcode; lwqq_async_event_finish(caller); }else{ lwqq_async_add_event_listener(caller,_C_(2p,on_chain,caller,called)); } }
static void login_stage_2(LwqqClient* lc,LwqqErrorCode* err) { if(!lwqq_client_valid(lc)) err&&(*err=LWQQ_EC_ERROR); /** * Second, we get the verify code from server. * If server provide us a image and let us enter code shown * in image number, in this situation, we just return LWQQ_EC_LOGIN_NEED_VC * simply, so user should call lwqq_login() again after he set correct * code to vc->str; * Else, if we can get the code directly, do login immediately. * */ if (!lc->vc) { LwqqAsyncEvent* ev = check_need_verify(lc,APPID); lwqq_async_add_event_listener(ev,_C_(2p,login_stage_3,ev,err)); return; } login_stage_4(lc,err); }
/** * Do really login * * @param lc * @param md5 The md5 calculated from calculate_password_md5() * @param err */ static LwqqAsyncEvent* do_login(LwqqClient *lc, const char *md5, LwqqErrorCode *err) { char url[1024]; LwqqHttpRequest *req; snprintf(url, sizeof(url), WEBQQ_LOGIN_HOST"/login?" "u=%s&p=%s&verifycode=%s&" "webqq_type=%d&remember_uin=1&aid=1003903&login2qq=1&" "u1=http%%3A%%2F%%2Fweb.qq.com%%2Floginproxy.html" "%%3Flogin2qq%%3D1%%26webqq_type%%3D10&h=1&ptredirect=0&" "ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&" "action=2-11-7438&mibao_css=m_webqq&t=1&g=1", lc->username, md5, lc->vc->str,lc->stat); req = lwqq_http_create_default_request(lc,url, err); lwqq_verbose(3,"%s\n",url); /* Setup http header */ req->set_header(req, "Cookie", lwqq_get_cookies(lc)); /* Send request */ return req->do_request_async(req, 0, NULL,_C_(p_i,do_login_back,req)); }
static void send_file(LwqqAsyncEvent* event,PurpleXfer *xfer) { qq_account* ac = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account)); LwqqClient* lc = ac->qq; long errno = 0; if(lwqq_async_event_get_code(event)==LWQQ_CALLBACK_FAILED){ s_free(xfer->data); return; } errno = lwqq_async_event_get_result(event); LwqqMsgOffFile* file = xfer->data; //purple_xfer_unref(xfer); if(errno) { qq_sys_msg_write(ac,LWQQ_MT_BUDDY_MSG, file->to,"上传空间不足",PURPLE_MESSAGE_ERROR,time(NULL)); lwqq_msg_offfile_free(file); s_free(xfer->data); purple_xfer_set_completed(xfer,1); } else { LwqqAsyncEvent* ev = lwqq_msg_send_offfile(lc,file); lwqq_async_add_event_listener(ev,_C_(2p,send_offline_file_receipt,ev,xfer)); } }
/** * Set online status, this is the last step of login * * @param err * @param lc */ static LwqqAsyncEvent* set_online_status(LwqqClient *lc,const char *status) { char msg[1024] ={0}; char *buf; LwqqHttpRequest *req = NULL; if (!status) { return NULL; } lc->clientid = generate_clientid(); if (!lc->clientid) { lwqq_log(LOG_ERROR, "Generate clientid error\n"); return NULL; } snprintf(msg, sizeof(msg), "{\"status\":\"%s\",\"ptwebqq\":\"%s\"," "\"passwd_sig\":""\"\",\"clientid\":\"%s\"" ", \"psessionid\":null}" ,status, lc->cookies->ptwebqq ,lc->clientid); buf = url_encode(msg); snprintf(msg, sizeof(msg), "r=%s", buf); s_free(buf); /* Create a POST request */ req = lwqq_http_create_default_request(lc,WEBQQ_D_HOST"/channel/login2", NULL); lwqq_puts("[set online status]\n"); /* Set header needed by server */ req->set_header(req, "Cookie2", "$Version=1"); req->set_header(req, "Referer", WEBQQ_D_REF_URL); req->set_header(req, "Content-type", "application/x-www-form-urlencoded"); /* Set http cookie */ req->set_header(req, "Cookie", lwqq_get_cookies(lc)); return req->do_request_async(req, 1, msg,_C_(p_i,set_online_status_back,req)); }