Example #1
0
/**
**  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);
}
Example #2
0
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);
}
Example #3
0
/** 
 * 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);
	}
}
Example #4
0
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);
}
Example #5
0
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);
}
Example #6
0
/**
**  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);
}
Example #7
0
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);
}
Example #8
0
/** 
 * 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;
}
Example #9
0
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));
}
Example #10
0
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);
}
Example #11
0
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));
}
Example #12
0
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));
}
Example #13
0
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));

}
Example #14
0
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;
}
Example #15
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));
}
Example #16
0
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));
}
Example #17
0
/** 
 * 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));
}
Example #18
0
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));
}
Example #19
0
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));
}
Example #20
0
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));
}
Example #21
0
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));
}
Example #22
0
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));
}
Example #23
0
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));
}
Example #24
0
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));
}
Example #25
0
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));
}
Example #26
0
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));
	}
}
Example #27
0
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);
}
Example #28
0
/** 
 * 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));
}
Example #29
0
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));
    }
}
Example #30
0
/** 
 * 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));
}