Exemplo n.º 1
0
//
// Update qq number
// Run in get_info_loop.
//
static void update_buddy_qq_number(QQInfo *info, QQMainPanel *panel)
{
    if(info == NULL || panel == NULL){
        return;
    }

    gint i;
    gint t_num = 6;
    GThread **threads = g_malloc(sizeof(GThread*) * t_num);
    GError *err = NULL;
    ThreadFuncPar *par = NULL;
    for(i = 0; i < t_num; ++i){
        par = g_slice_new0(ThreadFuncPar);
        par -> array = NULL;
        par -> t_num = t_num;
        par -> id = i;
        par -> info = info;
        threads[i] = g_thread_create(get_buddy_qqnumber_thread_func
                                     , par, TRUE, &err);
        if(threads[i] == NULL){
            g_warning("Create thread to get face image error. %s (%s, %d)"
                      , err -> message, __FILE__, __LINE__);
            g_error_free(err);
        }
    }
    for(i = 0; i < t_num; ++i){
        g_thread_join(threads[i]);
    }

    g_free(threads);

    //update the panel
    gqq_mainloop_attach(&gtkloop, qq_mainpanel_update_buddy_faceimg, 1, panel);
    return;
}
Exemplo n.º 2
0
//
// Send button clicked handler
//
static void qq_chatwindow_on_send_clicked(GtkWidget *widget, gpointer  data)
{
    QQChatWindowPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE(data
                                        , qq_chatwindow_get_type()
                                        , QQChatWindowPriv);
    GPtrArray *cs = g_ptr_array_new();
    qq_chat_textview_get_msg_contents(qq_chatwidget_get_input_textview(
                                            priv -> chat_widget), cs);
    if(cs -> len <= 0){
        // empty input text view
        //
        // Show warning message...
        //
        g_ptr_array_free(cs, TRUE);
        return;
    }
    qq_chat_textview_clear(qq_chatwidget_get_input_textview(
                                            priv -> chat_widget));

    QQSendMsg *msg = qq_sendmsg_new(info, MSG_BUDDY_T, priv -> uin);
    gint i;
    for(i = 0; i < cs -> len; ++i){
        qq_sendmsg_add_content(msg, g_ptr_array_index(cs, i));
    }
    g_ptr_array_free(cs, TRUE);

    QQMsgContent *font = qq_chatwidget_get_font(priv -> chat_widget);
    qq_sendmsg_add_content(msg, font);

    qq_chatwidget_add_send_message(priv -> chat_widget, msg);
    gqq_mainloop_attach(send_loop, qq_chatwindow_send_msg_cb
                                , 2, data, msg);
    return;
}
Exemplo n.º 3
0
//
// Update the details.
//
static void update_details(QQInfo *info, QQLoginPanel *panel)
{
    // update my information
    qq_get_buddy_info(info, info -> me, NULL);
    gqq_mainloop_attach(&gtkloop
                        , qq_mainpanel_update_my_info
                        , 1
                        , QQ_MAINWINDOW(panel -> container) -> main_panel);

    // update online buddies
    qq_get_online_buddies(info, NULL);
    gqq_mainloop_attach(&gtkloop
                        , qq_mainpanel_update_online_buddies
                        , 1
                        , QQ_MAINWINDOW(panel -> container) -> main_panel);

    //update qq number
    update_buddy_qq_number(info
                           , (QQMainPanel*)QQ_MAINWINDOW(panel -> container) 
                           -> main_panel);
    // update group number
    gint i;
    QQGroup *grp;
    gchar num[100];
    for(i = 0; i < info -> groups -> len; ++i){
        grp = g_ptr_array_index(info -> groups, i);
        if(grp == NULL){
            continue;
        }
        qq_get_qq_number(info, grp -> code -> str, num, NULL);
        qq_group_set(grp, "gnumber", num);
    }
    gqq_mainloop_attach(&gtkloop
                        , qq_mainpanel_update_group_info 
                        , 1
                        , QQ_MAINWINDOW(panel -> container) -> main_panel);

    //update face image
    update_face_image(info
                      , (QQMainPanel*)QQ_MAINWINDOW(panel -> container) 
                      -> main_panel);
}
Exemplo n.º 4
0
//
// Run in message loop
//
static gint do_login(QQLoginPanel *panel)
{
    const gchar *uin = panel -> uin;
    const gchar *passwd = panel -> passwd;
    const gchar *status = panel -> status;

    GError *err = NULL;
    gint ret = qq_login(info, uin, passwd, status, &err);
    const gchar *msg;
    switch(ret)
    {
        case NO_ERR:
            // going on
            return 0;
        case NETWORK_ERR:
            msg = "Network error. Please try again.";
            break;
        case WRONGPWD_ERR:
            msg = "Wrong Password.";
            break;
        case WRONGUIN_ERR:
            msg = "Wrong QQ Number.";
            break;
        case WRONGVC_ERR:
            msg = "Wrong Verify Code.";
            break;
        default:
            msg = "Error. Please try again.";
            break;
    }
    g_warning("Login error! %s (%s, %d)", err -> message, __FILE__, __LINE__);
    g_error_free(err);
    //show err message
    gqq_mainloop_attach(&gtkloop, gtk_label_set_text, 2, panel -> err_label, msg);
    return -1;
}
Exemplo n.º 5
0
//
// Get all buddies' and groups' face images
// Run in get_info_loop.
//
static void update_face_image(QQInfo *info, QQMainPanel *panel)
{
    if(info == NULL || panel == NULL){
        return;
    }

    GPtrArray *fimgs = g_ptr_array_new();
    gint i;
    QQBuddy *bdy = NULL;
    QQFaceImg *img = NULL;

    // me
    img = qq_faceimg_new(); 
    qq_faceimg_set(img, "uin", info -> me -> uin);
    qq_faceimg_set(img, "num", info -> me  -> qqnumber);
    g_ptr_array_add(fimgs, img);
    
    // buddies 
    for(i = 0; i < info -> buddies -> len; ++i){
        bdy = g_ptr_array_index(info -> buddies, i);
        if(bdy == NULL){
            continue;
        }
        img = qq_faceimg_new(); 
        qq_faceimg_set(img, "uin", bdy -> uin);
        qq_faceimg_set(img, "num", bdy -> qqnumber);
        g_ptr_array_add(fimgs, img);
    }
#if 0
    // groups
    QQGroup *grp = NULL;
    for(i = 0; i < info -> groups -> len; ++i){
        grp = g_ptr_array_index(info -> groups, i);
        if(grp == NULL){
            continue;
        }
        img = qq_faceimg_new(); 
        qq_faceimg_set(img, "uin", grp -> code);
        qq_faceimg_set(img, "num", grp -> gnumber);
        g_ptr_array_add(fimgs, img);
    }
#endif
    gint t_num = 2;
    GThread **threads = g_malloc(sizeof(GThread*) * t_num);
    GError *err = NULL;
    ThreadFuncPar *par = NULL;
    for(i = 0; i < t_num; ++i){
        par = g_slice_new0(ThreadFuncPar);
        par -> array = fimgs;
        par -> t_num = t_num;
        par -> id = i;
        par -> info = info;
        threads[i] = g_thread_create(get_buddy_face_thread_func
                                     , par, TRUE, &err);
        if(threads[i] == NULL){
            g_warning("Create thread to get face image error. %s (%s, %d)"
                      , err -> message, __FILE__, __LINE__);
            g_error_free(err);
        }
    }
    for(i = 0; i < t_num; ++i){
        g_thread_join(threads[i]);
    }

    for(i = 0; i < fimgs -> len; ++i){
        img = g_ptr_array_index(fimgs, i);
        qq_faceimg_free(img);
    }
    g_free(threads);

    //update the buddy info
    gqq_mainloop_attach(&gtkloop, qq_mainpanel_update_buddy_faceimg, 1, panel);
    gqq_mainloop_attach(&gtkloop, qq_mainpanel_update_group_info, 1, panel);
}
Exemplo n.º 6
0
//
// The login state machine is run in the message loop.
//
static void run_login_state_machine(QQLoginPanel *panel)
{
    gqq_mainloop_attach(get_info_loop, login_state_machine, 1, panel); 
}
Exemplo n.º 7
0
static void login_state_machine(gpointer data)
{
    QQLoginPanel *panel = (QQLoginPanel*)data;
    while(TRUE){
        switch(state)
        {
            case LOGIN_SM_CHECKVC:
                if(qq_check_verifycode(info, panel -> uin, NULL) != 0){
                    state = LOGIN_SM_ERR;
                    break;
                }
                state = LOGIN_SM_LOGIN;
                if(info -> need_vcimage){
                    gqq_mainloop_attach(&gtkloop, read_verifycode, 1, panel);
                    // Quit the state machine.
                    // The state machine will restart in the read verify code
                    // dialog.
                    return;
                }
            case LOGIN_SM_LOGIN:
                if(do_login(panel) != 0){
                    state = LOGIN_SM_ERR;
                }else{
                    state = LOGIN_SM_GET_DATA;
                }
                break;
            case LOGIN_SM_GET_DATA:
                //Read cached data from db
                gqq_config_load(cfg, panel -> uin);
                qq_get_buddies_and_categories(info, NULL);
                qq_get_groups(info, NULL);
                state = LOGIN_SM_DONE;
                break;
            case LOGIN_SM_DONE:
                g_debug("Login done. show main panel!(%s, %d)", __FILE__, __LINE__);
                //
                // Start poll message
                //
                qq_start_poll(info, qq_poll_message_callback, &gtkloop, NULL);
                // update main panel
                gqq_mainloop_attach(&gtkloop, qq_mainpanel_update
                                    , 1, QQ_MAINWINDOW(panel -> container) 
                                    -> main_panel);
                // show main panel
                gqq_mainloop_attach(&gtkloop, qq_mainwindow_show_mainpanel
                                    , 1, panel -> container);
                update_details(info, panel);

                return;
            case LOGIN_SM_ERR:
                g_debug("Login error... (%s, %d)", __FILE__, __LINE__);
                gqq_mainloop_attach(&gtkloop, qq_mainwindow_show_loginpanel
                                    , 1, panel -> container);
                g_debug("Show login panel.(%s, %d)", __FILE__, __LINE__);
                return;
            default:
                break;
        }
    }
    return;
}