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); }
/** * 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, LwqqErrorCode *err) { if (!client || !err) { lwqq_log(LOG_ERROR, "Invalid pointer\n"); return ; } /* First: get webqq version */ get_version(client, err); if (*err) { lwqq_log(LOG_ERROR, "Get webqq version error\n"); return ; } lwqq_log(LOG_NOTICE, "Get webqq version: %s\n", client->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 (!client->vc) { get_verify_code(client, err); switch (*err) { case LWQQ_EC_LOGIN_NEED_VC: get_verify_image(client); lwqq_log(LOG_WARNING, "Need to enter verify code\n"); return ; case LWQQ_EC_NETWORK_ERROR: lwqq_log(LOG_ERROR, "Network error\n"); return ; case LWQQ_EC_OK: lwqq_log(LOG_DEBUG, "Get verify code OK\n"); break; default: lwqq_log(LOG_ERROR, "Unknown error\n"); return ; } } /* Third: calculate the md5 */ char *md5 = lwqq_enc_pwd(client->password, client->vc->str, client->vc->uin); /* Last: do real login */ do_login(client, md5, err); s_free(md5); /* Free old value */ lwqq_vc_free(client->vc); client->vc = NULL; }
static void login_stage_2(LwqqClient* lc) { if(!lwqq_client_valid(lc)) return; /** * 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); }