gint main(gint argc,gchar* argv[]) { int res; /*---GTK��ʼ��----*/ gtk_init(&argc, &argv); g_thread_init(NULL); gdk_threads_init(); struct wcam_win *c = calloc(1, sizeof(struct wcam_win)); c->entry_win = login_create(); res = login_run(c->entry_win); if (res == -1) { goto err_win; } login_hide(c->entry_win); main_create(c); main_run(); err_win: free(c->entry_win); free(c); return 0; }
/* * High-level handling of login requests * Uses login specific routines from login.c * */ static int process_login_request(sp_session *s, struct request *req) { int ret; sp_error error; unsigned char key_recv[32], key_send[32]; if(req->state == REQ_STATE_NEW) { req->state = REQ_STATE_RUNNING; s->login = login_create(s->username, s->password); if(s->login == NULL) return request_set_result(s, req, SP_ERROR_OTHER_TRANSIENT, NULL); } /* * A call to sp_session_logout() will post a REQ_TYPE_LOGOUT * It will trigger a call to process_logout_request() which in turn * will call login_release() on s->login and set it to NULL. * * We check for this condition here and return SP_ERROR_OTHER_TRANSIENT * */ if(s->login == NULL) { /* Fail login with SP_ERROR_OTHER_TRANSIENT */ return request_set_result(s, req, SP_ERROR_OTHER_TRANSIENT, NULL); } ret = login_process(s->login); if(ret == 0) return 0; else if(ret == 1) { login_export_session(s->login, &s->sock, key_recv, key_send); login_release(s->login); s->login = NULL; shn_key(&s->shn_recv, key_recv, sizeof(key_recv)); s->key_recv_IV = 0; shn_key(&s->shn_send, key_send, sizeof(key_send)); s->key_send_IV = 0; s->connectionstate = SP_CONNECTION_STATE_LOGGED_IN; DSFYDEBUG("Logged in\n"); return request_set_result(s, req, SP_ERROR_OK, NULL); } switch(s->login->error) { case SP_LOGIN_ERROR_DNS_FAILURE: case SP_LOGIN_ERROR_NO_MORE_SERVERS: error = SP_ERROR_UNABLE_TO_CONTACT_SERVER; break; case SP_LOGIN_ERROR_UPGRADE_REQUIRED: error = SP_ERROR_CLIENT_TOO_OLD; break; case SP_LOGIN_ERROR_USER_BANNED: error = SP_ERROR_USER_BANNED; break; case SP_LOGIN_ERROR_USER_NOT_FOUND: case SP_LOGIN_ERROR_BAD_PASSWORD: error = SP_ERROR_BAD_USERNAME_OR_PASSWORD; break; case SP_LOGIN_ERROR_USER_NEED_TO_COMPLETE_DETAILS: case SP_LOGIN_ERROR_USER_COUNTRY_MISMATCH: case SP_LOGIN_ERROR_OTHER_PERMANENT: error = SP_ERROR_OTHER_PERMANENT; break; case SP_LOGIN_ERROR_SOCKET_ERROR: default: error = SP_ERROR_OTHER_TRANSIENT; break; } login_release(s->login); s->login = NULL; DSFYDEBUG("Login failed with error: %s\n", sp_error_message(error)); return request_set_result(s, req, error, NULL); }