Example #1
0
void MessageWind::insertSms(Message newsms)  //将消息保存到合适的短信集合
{
    if(newsms.content=="+++"||newsms.content=="---"||newsms.content=="+-+")//若为上线或者下线的消息
    {
       if(newsms.content=="+++") //对方发来对方的上线消息
        {
            contact_online(newsms.number,true);//标示对方上线,并且回发响应信息和对方的离线消息
            Chat *chat;
            if(chatdialogexist(*(indexofcontact(newsms.number)),&chat))
                chat->contatonline();//存在对应联系人的聊天窗口,则重建到对应联系人的连接
        }
        else
            if(newsms.content=="---") //离线消息,标志对方离线
                contact_offline(newsms.number);
            else//收到+-+            //收到对方发送的我上线的响应消息,则只需要将对方标记为上线,并发送对方的离线消息
            {
                contact_online(newsms.number,false);
            }
        return;
    }
    //若消息为正常消息
    newsms.content=newsms.content.mid(3,newsms.content.length()-3);//去除消息的头部
    if(hasBadWords(newsms.content)) //还有敏感词汇,直接扔进垃圾箱
    {
        newsms.from=3;//设置为未读
        newsms.now=2;
        allMessages.prepend(newsms);
        update();
        return;
    }
    else
    {
       QTreeWidgetItem *item=finditem(newsms.number);//查找对应号码的子节点
        if(item!=NULL)//存在对应的联系人
        {
            Contact contact=texttocontact(item->whatsThis(0)); //提取联系人信息
            if(contact.number==newsms.number)
            {
                Chat *chat;
                if(chatdialogexist(contact,&chat))//联系人已有聊天窗口打开
                {
                    chat->activateWindow();       //则将窗口激活
                    chat->addnewmessage(numberToName(newsms.number),newsms);//在聊天窗口中显示此消息
                    if(recogniseNumber(newsms.number)==-1)//来自黑名单
                        newsms.from=newsms.now=2;   //放入垃圾箱
                    else
                        newsms.from=newsms.now=1;    // 放入收件箱
                    allMessages.prepend(newsms);
                    update();
                    return;
                }
                else           //没有聊天窗口打开
                {
                    if(recogniseNumber(newsms.number)==-1)//来自黑名单
                        newsms.now=2;   //查看后放入垃圾箱
                    else
                        newsms.now=1;    // 查看后放入收件箱
                    unreadsms.append(newsms); //保存在未读短信集合中
                    addchildblink(item);       //让对应的子节点闪烁
                    update();
                    return;
                }
            }
        }
        else
        {
                //没有对应此号码的联系人
            Contact newcontact;
            newcontact.name=QString::null;
            newcontact.number=newsms.number;
            newcontact.onLine=true;    //将联系人设置为在线
            strangers.append(newcontact); //保存未知联系人
            QTreeWidgetItem *child=new QTreeWidgetItem(QStringList()<<(newcontact.name+":"+newcontact.number));
            child->setIcon(0,QIcon(":/icon/icons/user.png"));
            child->setWhatsThis(0,newcontact.name+":"+newcontact.number);
            ui->contactsTreeWidget->topLevelItem(1)->addChild(child);  //在联系人列表显示未知联系人
            newsms.now=1;  //将陌生人的信息存到收件箱
            unreadsms.append(newsms);  //添加未读消息
            addchildblink(child);   //设置为闪烁
            update();
        }
    }
}