/** * 好友广播消息. */ 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); }
//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; }