/* * Callback of login_btn button */ static void login_btn_cb(GtkButton *btn, gpointer data) { QQLoginPanel *panel = QQ_LOGINPANEL(data); GtkWidget *win = panel -> container; qq_mainwindow_show_splashpanel(win); panel -> uin = qq_loginpanel_get_uin(panel); panel -> passwd = qq_loginpanel_get_passwd(panel); panel -> status = qq_loginpanel_get_status(panel); panel -> rempw = qq_loginpanel_get_rempw(panel); g_debug("Start login... qqnum: %s, status: %s (%s, %d)", panel -> uin , panel -> status, __FILE__, __LINE__); // run the login state machine g_debug("Run login state machine...(%s, %d)", __FILE__, __LINE__); state = LOGIN_SM_CHECKVC; run_login_state_machine(panel); g_object_set(cfg, "qqnum", panel -> uin, NULL); g_object_set(cfg, "passwd", panel -> passwd, NULL); g_object_set(cfg, "status", panel -> status, NULL); g_object_set(cfg, "rempw", panel -> rempw, NULL); qq_buddy_set(info -> me, "qqnumber", panel -> uin); qq_buddy_set(info -> me, "uin", panel -> uin); qq_buddy_set(info -> me, "status", panel -> status); //clear the error message. gtk_label_set_text(GTK_LABEL(panel -> err_label), ""); gqq_config_save_last_login_user(cfg); }
gint qq_login(QQInfo *info, const gchar *qqnum, const gchar *passwd , const gchar *status, GError **err) { if(info == NULL){ g_warning("info == NULL. (%s, %d)", __FILE__, __LINE__); create_error_msg(err, PARAMETER_ERR, "info == NULL"); return PARAMETER_ERR; } if(qqnum == NULL || passwd == NULL || strlen(qqnum) == 0){ g_warning("qqnumber or passwd == NULL.(%s, %d)" , __FILE__, __LINE__); create_error_msg(err, PARAMETER_ERR, "qqnum or passwd == NULL"); return PARAMETER_ERR; } // // The user's uin and qq number are the same. // qq_buddy_set(info -> me, "qqnumber", qqnum); qq_buddy_set(info -> me, "uin", qqnum); if(status != NULL){ qq_buddy_set(info -> me, "status", status); }else{ qq_buddy_set(info -> me, "status", "online"); } return do_login(info, qqnum, passwd, status, err); }
// // QQBuddy // QQBuddy* qq_buddy_new() { QQBuddy *bd = g_slice_new0(QQBuddy); bd -> vip_info = -1; bd -> client_type = -1; #define NEW_STR(x) bd -> x = g_string_new("") NEW_STR(uin); NEW_STR(qqnumber); NEW_STR(status); NEW_STR(nick); NEW_STR(markname); NEW_STR(country); NEW_STR(city); NEW_STR(province); NEW_STR(gender); NEW_STR(face); NEW_STR(flag); NEW_STR(phone); NEW_STR(mobile); NEW_STR(email); NEW_STR(college); NEW_STR(occupation); NEW_STR(personal); NEW_STR(homepage); NEW_STR(lnick); #undef NEW_STR qq_buddy_set(bd, "status", "offline"); return bd; }
// // Get buddy qq number thread func // static gpointer get_buddy_qqnumber_thread_func(gpointer data) { ThreadFuncPar *par = data; gint t_num = par -> t_num; gint id = par -> id; QQInfo *info = par -> info; g_slice_free(ThreadFuncPar, par); gint i; gchar num[100]; QQBuddy *bdy; for(i = id; i < info -> buddies -> len; i += t_num){ bdy = g_ptr_array_index(info -> buddies, i); qq_get_qq_number(info, bdy -> uin -> str, num, NULL); qq_buddy_set(bdy, "qqnumber", num); } return NULL; }
gint db_get_buddy(sqlite3 *db, const gchar *owner, QQBuddy *bdy, gint *cnt) { if(db == NULL || owner == NULL || bdy == NULL){ return SQLITE_ERROR; } GString *sql = g_string_sized_new(500); g_string_append(sql, "select " "vip_info, nick, markname," "country, province, city, gender," "face, flag," "blood, shengxiao, constel, phone, mobile, email," "occupation, college, homepage, personal, lnick, " "birthday_y, birthday_m, birthday_d " "from buddies where owner="); g_string_append_printf(sql, "'%s' and qqnumber='%s';" , owner, bdy -> qqnumber -> str); sqlite3_stmt *stmt = NULL; if(sqlite3_prepare_v2(db, sql -> str, 500, &stmt, NULL) != SQLITE_OK){ g_warning("prepare sql error. SQL(%s) (%s, %d)", sql -> str , __FILE__, __LINE__); g_string_free(sql, TRUE); return SQLITE_ERROR; } g_string_free(sql, TRUE); gint retcode = SQLITE_OK; gint idx, y, m, d; gint num = 0; while(TRUE){ retcode = sqlite3_step(stmt); switch(retcode) { case SQLITE_ROW: bdy = qq_buddy_new(); idx = -1; qq_buddy_set(bdy, "vip_info", sqlite3_column_int(stmt, ++idx)); qq_buddy_set(bdy, "nick", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "markname", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "country", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "province", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "city", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "gender", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "face", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "flag", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "blood", sqlite3_column_int(stmt, ++idx)); qq_buddy_set(bdy, "shengxiao", sqlite3_column_int(stmt, ++idx)); qq_buddy_set(bdy, "constel", sqlite3_column_int(stmt, ++idx)); qq_buddy_set(bdy, "phone", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "mobile", (const gchar *)sqlite3_column_text(stmt,++idx)); qq_buddy_set(bdy, "email", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "occupation", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "college", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "homepage", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "personal", (const gchar *)sqlite3_column_text(stmt, ++idx)); qq_buddy_set(bdy, "lnick", (const gchar *)sqlite3_column_text(stmt, ++idx)); y = sqlite3_column_int(stmt, ++idx); m = sqlite3_column_int(stmt, ++idx); d = sqlite3_column_int(stmt, ++idx); qq_buddy_set(bdy, "birthday", y, m, d); ++num; break; case SQLITE_DONE: retcode = SQLITE_OK; goto out_label; break; default: g_warning("sqlite3_step error!(%s, %d)", __FILE__, __LINE__); goto out_label; break; } } out_label: if(cnt != NULL){ *cnt = num; } sqlite3_finalize(stmt); return retcode; }