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;
}
Example #2
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);
}