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(); } } }