コード例 #1
0
ファイル: UdpData.cpp プロジェクト: Chingpo-Lai/iptux
/**
 * 好友广播消息.
 */
void UdpData::SomeoneBcstmsg()
{
        GroupInfo *grpinf;
        PalInfo *pal;
        uint32_t commandno, packetno;
        char *text;

        /* 如果对方兼容iptux协议,则无须再转换编码 */
        pal = cthrd.GetPalFromList(ipv4);
        if (!pal || !FLAG_ISSET(pal->flags, 0))
                ConvertEncode(pal ? pal->encode : progdt.encode);
        /* 确保好友在线,并对编码作出适当调整 */
        pal = AssertPalOnline();
        if (strcasecmp(pal->encode, encode ? encode : "utf-8") != 0) {
                g_free(pal->encode);
                pal->encode = g_strdup(encode ? encode : "utf-8");
        }

        /* 检查此消息是否过时 */
        packetno = iptux_get_dec_number(buf, ':', 1);
        if (packetno <= pal->packetn)
                return;
        pal->packetn = packetno;

        /* 插入消息&在消息队列中注册 */
        text = ipmsg_get_attach(buf, ':', 5);
        if (text && *text != '\0') {
                commandno = iptux_get_dec_number(buf, ':', 4);
                /*/* 插入消息 */
                switch (GET_OPT(commandno)) {
                case IPTUX_BROADCASTOPT:
                        InsertMessage(pal, GROUP_BELONG_TYPE_BROADCAST, text);
                        break;
                case IPTUX_GROUPOPT:
                        InsertMessage(pal, GROUP_BELONG_TYPE_GROUP, text);
                        break;
                case IPTUX_SEGMENTOPT:
                        InsertMessage(pal, GROUP_BELONG_TYPE_SEGMENT, text);
                        break;
                case IPTUX_REGULAROPT:
                default:
                        InsertMessage(pal, GROUP_BELONG_TYPE_REGULAR, text);
                        break;
                }
                /*/* 注册消息 */
                pthread_mutex_lock(cthrd.GetMutex());
                switch (GET_OPT(commandno)) {
                case IPTUX_BROADCASTOPT:
                        grpinf = cthrd.GetPalBroadcastItem(pal);
                        break;
                case IPTUX_GROUPOPT:
                        grpinf = cthrd.GetPalGroupItem(pal);
                        break;
                case IPTUX_SEGMENTOPT:
                        grpinf = cthrd.GetPalSegmentItem(pal);
                        break;
                case IPTUX_REGULAROPT:
                default:
                        grpinf = cthrd.GetPalRegularItem(pal);
                        break;
                }
                if (!grpinf->dialog && !cthrd.MsglineContainItem(grpinf))
                        cthrd.PushItemToMsgline(grpinf);
                pthread_mutex_unlock(cthrd.GetMutex());
        }
        g_free(text);

        /* 播放提示音 */
        if (FLAG_ISSET(progdt.sndfgs, 1))
                sndsys.Playing(progdt.msgtip);
}
コード例 #2
0
ファイル: ipmsg_thread.c プロジェクト: amapig/ipmsg
//process recv's command thread
int processer()
{
    command *current_com;
    unsigned int mode, opt;
    
    while (1) {
        sem_wait(&msg_empty);
        pthread_mutex_lock(&msg_lock);
        current_com = mlist.com_head;
        mlist.com_head = current_com->next;
        pthread_mutex_unlock(&msg_lock);

        if (current_com == NULL) {
            continue;
        }

        mode = GET_MODE(current_com->com_num);
        opt = GET_OPT(current_com->com_num);
        switch (mode) {
            case IPMSG_BR_ENTRY:
                send_recventry(current_com);
                pthread_mutex_lock(&user_lock);
                add_user(current_com);
                pthread_mutex_unlock(&user_lock);
                free(current_com);
                break;
            case IPMSG_BR_EXIT:
                pthread_mutex_lock(&user_lock);
                del_user(current_com);
                pthread_mutex_unlock(&user_lock);
                free(current_com);
                break;
            case IPMSG_ANSENTRY:
                pthread_mutex_lock(&user_lock);
                add_user(current_com);
                pthread_mutex_unlock(&user_lock);
                free(current_com);
                break;
            case IPMSG_SENDMSG:
                if (opt & IPMSG_SENDCHECKOPT) {
                    send_check(current_com);
                }
                if (opt & IPMSG_FILEATTACHOPT) {
                    printf("IN PRO SENDMSG: receive file.\n");
                    recv_files(current_com);
                }else {
                    putout_msg(current_com);
                    free(current_com);
                }
                break;
            case IPMSG_RECVMSG:
                free(current_com);
                break;
            case IPMSG_GETFILEDATA:
                free(current_com);
                break;
            case IPMSG_GETDIRFILES:
                free(current_com);
                break;
            case IPMSG_RELEASEFILES:
                free(current_com);
                break;
            default:
                free(current_com);
                break;
        }
    }

    return 0;
}