void PacketProcesser::processUserChangeStatus(InPacket *inPacket)
{
	static short filter = 0;	//用于过滤重复收到的包
	short sequence = inPacket->getSequence();
	if(filter == sequence)
	{
		delete inPacket;
		return;
	}
	filter = sequence;
	//删除重发队列中的包
	wingApp->packetStorage->removeNeedAckPacketBySeq(sequence);


	uint8 *bodyPtr = inPacket->getBody();
	uint8 flag = bodyPtr[0];
	if(flag == 0x30) //成功
	{
		//打印调试信息
		DWHERE();
		DPRINT("- - - > User change status succeed!");
	}
	else
	{
		//打印调试信息
		DWHERE();
		DPRINT("- - - > User change status failed!");
	}

	SAFE_DELETE(inPacket);
}
Exemple #2
0
void PacketStorage::removeNeedAckPacketBySeq(unsigned short seq)
{
    mutex.lock();
    if(!needAckPacketList.isEmpty())
    {
        //打印调试信息
        DWHERE();
        DPRINT("- - - > needAckPacketList.size():%d",needAckPacketList.size());

        OutPacket * outPacketPtr = NULL;
        QHashIterator<short, OutPacket *> iter(needAckPacketList);
        while(iter.hasNext())
        {
            iter.next();

            if(iter.key() == seq)
            {
                outPacketPtr = iter.value();
                needAckPacketList.remove(iter.key());
                SAFE_DELETE(outPacketPtr);

                //打印调试信息
                DWHERE();
                DPRINT("- - - > needAckPacketList.size():%d",needAckPacketList.size());
            }
        }
    }
    mutex.unlock();
}
Exemple #3
0
void PacketStorage::removeOutPacketByCom(unsigned short com)
{
    mutex.lock();
    if(!outPacketList.isEmpty())
    {
        //打印调试信息
        DWHERE();
        DPRINT("- - - > outPacketList.size():%d",outPacketList.size());

        OutPacket * outPacketPtr = NULL;
        QHashIterator<short, OutPacket *> iter(outPacketList);
        while(iter.hasNext())
        {
            iter.next();
            outPacketPtr = iter.value();

            if(outPacketPtr->getCommand() == com)
            {
                outPacketList.remove(iter.key());
                SAFE_DELETE(outPacketPtr);

                //打印调试信息
                DWHERE();
                DPRINT("- - - > outPacketList.size():%d",outPacketList.size());
            }
        }
    }
    mutex.unlock();
}
void PacketProcesser::processReceiveIM(InPacket *inPacket)
{
	if(inPacket->getBodyLen() > 15)
	{
		//发送收到应答信息,通知服务消息已收到,内容是收到的信息的前16字节
		OutPacket *imReplyPacket = wingApp->packetBuilder->buildReceiveIMReplyPacket(inPacket);
		wingApp->packetStorage->appendOutPacket(imReplyPacket);
	}
	else
	{
		SAFE_DELETE(inPacket);
		return;
	}

	static short filter = 0;	//用于过滤重复收到的包
	short sequence = inPacket->getSequence();
	if(filter == sequence)
	{
		SAFE_DELETE(inPacket);
		return;
	}
	filter = sequence;

	ReceiveIMPacket *receiveIMPacket = new ReceiveIMPacket();
	receiveIMPacket->fromInPacket(inPacket);
	switch(receiveIMPacket->imKind)
	{
		case ReceiveIMPacket::QQ_IM_FROM_USER:
			wingApp->guiHandling->imFromUser(receiveIMPacket);
			break;
		case ReceiveIMPacket::QQ_IM_FROM_SYS:
			wingApp->guiHandling->imFromSys(receiveIMPacket);
			break;
		case ReceiveIMPacket::QQ_IM_FROM_CLUSTER:
			wingApp->guiHandling->imFromCluster(receiveIMPacket);
			break;
		case ReceiveIMPacket::QQ_IM_FROM_SMS:
			wingApp->guiHandling->imFromSms(receiveIMPacket);
			break;
		case ReceiveIMPacket::CANNOT_PARSE:
		{
			SAFE_DELETE(receiveIMPacket);

			//打印调试信息
			DWHERE();
			DPRINT("- - - > one im packet cannot be parsed!");
		}
			break;
		default:
			;
	}

	//打印调试信息
	DWHERE();
	DPRINT("- - - > receive ReceiveIMPacket!");
	SAFE_DELETE(inPacket);
}
Exemple #5
0
PacketStorage::~PacketStorage()
{
    if(checker->isActive())
        checker->stop();
    SAFE_DELETE(checker);

    if(keepAliveTimer->isActive())
        keepAliveTimer->stop();
    SAFE_DELETE(keepAliveTimer);

    deleteAllPacket();

    mutex.lock();

    //设置结束线程标志
    endThreadFlag = true;
    packetListEmpty.wakeOne();

    mutex.unlock();
    //等待线程退出
    wait();

    //打印调试信息
    DWHERE();
}
void PacketProcesser::processUnknownMsg(InPacket *inPacket)
{
	//打印调试信息
	DWHERE();
	DPRINT("- - - > RECEIVE UNKNOWN InPacket! COMMAND:%#x", inPacket->getCommand());
	SAFE_DELETE(inPacket);
}
void PacketProcesser::processOutPacketSlot(OutPacket *outPacket)
{
	//打印调试信息
	DWHERE();
	DPRINT("- - - > new outpacket! command:%#x bodyLen:%d",outPacket->getCommand(), (int)outPacket->getBodyLen());
/*
#ifdef QT_DEBUG
	uint8 *bodyPtr = outPacket->getBody();
	int bodyLen = outPacket->getBodyLen();

	for(int i=0; i<bodyLen; i++)
	{
		if(!(i%8))
			fprintf(stderr, "\n%d: ", i);
		fprintf(stderr, "%2x ", bodyPtr[i]);
	}
	fprintf(stderr, "\n");
	fflush(stderr);
#endif
*/
	uint8 *outStr = new uint8[QQ_PACKET_MAX_SIZE]; //65535
	int len = 0;
	outPacket->toByteArrary(outStr, &len);
	wingApp->netManager->send(outStr, len);

	//如果不是需要应答的包,删除
	if(!outPacket->ifNeedAck())
		SAFE_DELETE(outPacket);
}
void PacketProcesser::processGetOnlineFriendListReply(InPacket *inPacket)
{
	static short filter = 0;	//用于过滤重复收到的包
	short sequence = inPacket->getSequence();
	if(filter == sequence)
	{
		SAFE_DELETE(inPacket);
		return;
	}
	filter = sequence;
	//删除重发队列中的包
	wingApp->packetStorage->removeNeedAckPacketBySeq(sequence);

	uint8 *bodyPtr = inPacket->getBody();
	int bodyLen = inPacket->getBodyLen();

	uint8 *bodyCopy = new uint8[bodyLen];
	memcpy(bodyCopy, bodyPtr, bodyLen);

	uint8 endFlag;
	endFlag = bodyPtr[0];
	if(0xFF != endFlag)
	{
		OutPacket *getFriendList = wingApp->packetBuilder->buildFriendListRequestPacket(inPacket);
		wingApp->packetStorage->appendOutPacket(getFriendList);
	}
	wingApp->buddyManager->putOnlineBuddyList(bodyCopy, bodyLen);
	//打印调试信息
	DWHERE();
	DPRINT("- - - > receive GetOnlineFriendListReply!");
	SAFE_DELETE(inPacket);
}
void PacketProcesser::processFriendChangeStatus(InPacket *inPacket)
{
	static short filter = 0;	//用于过滤重复收到的包
	short sequence = inPacket->getSequence();
	if(filter == sequence)
	{
		delete inPacket;
		return;
	}
	filter = sequence;

	uint32 pos = 0, sender;
	uint8 sta;
	uint8 *bodyPtr = inPacket->getBody();
	ToolKit::readBufDW(bodyPtr, sender);
	pos += 4;
	pos += 8;
	sta = bodyPtr[pos++];

	wingApp->guiHandling->friendChangeStatus(sender, sta);

	//打印调试信息
	DWHERE();
	DPRINT("- - - > receive FriendChangeStatus!");
	SAFE_DELETE(inPacket);
}
void PacketProcesser::processNoAckPacketSlot(OutPacket *outPacket)
{
	//取得接收包的命令字
	short command = outPacket->getCommand();

	switch(command)
	{
		case QQ_TOUCH_REQUEST:
		case QQ_REQUEST_PRE_LOGIN_TOKEN:
		case QQ_REQUEST_LOGIN_TOKEN:
		case QQ_REQUEST_PRE_SESSION_KEY:
		case QQ_REQUEST_SESSION_KEY:
		{
			WING_EVENT *loginFailed = new WING_EVENT(WING_EVENT::loginFailed,"PacketProcesser","login failed!",0);
			wingApp->eventProcesser->longEventHandling(loginFailed);
		}
			break;
		case QQ_KEEP_ALIVE:
		{
			WING_EVENT *fallLine = new WING_EVENT(WING_EVENT::fallLine,"PacketProcesser","wing has fall line !",0);
			wingApp->eventProcesser->longEventHandling(fallLine);
		}
			break;

	}
	//打印调试信息
	DWHERE();
	DPRINT("- - - > failed to send msg!");
	SAFE_DELETE(outPacket);
}
WingDialogWindow::~WingDialogWindow()
{
	SAFE_DELETE(sysMsgBrowser);

	//打印调试信息
	DWHERE();
}
void PacketProcesser::processSendIMReply(InPacket *inPacket)
{
	//删除重发队列中的包
	wingApp->packetStorage->removeNeedAckPacketBySeq(inPacket->getSequence());

	//打印调试信息
	DWHERE();
	DPRINT("- - - > receive SendIMReply!");
	SAFE_DELETE(inPacket);
}
void PacketProcesser::processKeepAliveReply(InPacket *inPacket)
{
	static short filter = 0;	//用于过滤重复收到的包
	short sequence = inPacket->getSequence();
	if(filter == sequence)
	{
		SAFE_DELETE(inPacket);
		return;
	}
	filter = sequence;
	//删除重发队列中的包
	wingApp->packetStorage->removeNeedAckPacketBySeq(sequence);

	//打印调试信息
	DWHERE();
	DPRINT("- - - > receive keepAliveReplyPacket!");

	SAFE_DELETE(inPacket);
}
void WingDialogWindow::onTreeItemDoubleClicked(WingTreeWidgetItem *item)
{
	//打印调试信息
	DWHERE();
	DPRINT("- - - > onItemDoubleClicked:%u",item->buddyQQNum);

	if(item->msgBrowser)
	{
		if(tabWidget->indexOf(item->msgBrowser) == -1)
			tabWidget->addTab(item->msgBrowser, item->icon(0), item->text(0));
	}
	else
	{
		item->msgBrowser = new WingTextBrowser();
		item->msgBrowser->buddyQQNum = item->buddyQQNum;
		tabWidget->addTab(item->msgBrowser, item->icon(0), item->text(0));
	}
	tabWidget->setCurrentWidget(item->msgBrowser);

	if(this->isHidden())
		this->show();
}
void SerialThread_Write::run()
{
    DWHERE();
    while(!stopped)
    {
        msleep(100);
        /*读取串口数据*/
        if(port->isOpen())
        {
//            if (type)
//            {
//                QByteArray readByte;
//                qint64 readNum = 0;
//                while((readNum = port->bytesAvailable()) >= 1)
//                {
//                    msleep(50);
//                    mutex.lock();
////                    readByte = port->read(readNum);
//                    readByte = port->readAll();
//                    emit dataReceived(readByte);
//                    mutex.unlock();
//                    qDebug() << readByte;
//                    qDebug()<< "uft8_gbK :" << _From_UTF8_2_GBK(readByte);
//                    //                    foreach(char ch, readByte)
//                    //                    {
//                    //                        if((ch > 0)/* && (ch != 13) && (ch != 10) && (ch != 32)*/)
//                    //                        {
//                    //                            readStr.append(ch);
//                    //                        }
//                    //                    }
//                    // 读完数据后等待10 毫秒
//                    readNum = 0;
//                    readByte.clear();


//                }
//            }
//            else //*  ==我是读数据和写数据的分割线================================================*/
//            {
                while(isWrire)
                {
                    if(!sendStr.isEmpty())
                    {
                        //                    int sendNum = writeStringToSerialPort(sendStr);
                        mutex.lock();
                        port->write(sendStr);
                        qint64 sendNum =  sendStr.size();
                        qDebug() << "sendNum" << sendNum;
                        emit sig_sendNum(sendNum);
                        mutex.unlock();
                    }
                    if(continuesSend)
                    {
                        msleep(msc);
                    }
                    else
                    {
                        isWrire = false;
                        sendStr.clear();
                        msc = 0;
                    }
                }
            }
//        }
    }
}
Exemple #16
0
void PacketStorage::run()
{

    while(1)
    {
        mutex.lock();

        //如果outPacketList和inPacketList同时为空且endThreadFlag为假时,则等待
        while(outPacketList.isEmpty() && inPacketList.isEmpty() && !endThreadFlag)
            packetListEmpty.wait(&mutex);

        //如果释构标志被设置,则跳出循环,结束线程
        if(endThreadFlag)
        {
            //打印调试信息
            DWHERE();
            break;
        }
        //发送包队列非空
        if(!outPacketList.isEmpty())
        {
            //打印调试信息
            DWHERE();
            DPRINT("- - - > outPacketList.size():%d",outPacketList.size());

            QHashIterator<short, OutPacket *> iter(outPacketList);
            if(iter.hasNext())
            {
                iter.next();
                OutPacket *outPacketPtr = iter.value();

                //
                wingApp->packetProcesser->processOutPacket(outPacketPtr);

                if(outPacketPtr->ifNeedAck())
                {
                    //如果需要应答,把它插入需应答队列
                    needAckPacketList.insert(iter.key(), iter.value());

                    //打印调试信息
                    DWHERE();
                    DPRINT("- - - > needAckPacketList.size():%d",needAckPacketList.size());

                    //包出队
                    outPacketList.remove(iter.key());
                }
                else
                {
                    //包出队
                    outPacketList.remove(iter.key());
                }

                //打印调试信息
                DWHERE();
                DPRINT("- - - > outPacketList.size():%d",outPacketList.size());
            }
        }
        //接收包队列非空
        if(!inPacketList.isEmpty())
        {
            //打印调试信息
            DWHERE();
            DPRINT("- - - > inPacketList.size():%d",inPacketList.size());

            QHashIterator<short, InPacket *> iter(inPacketList);
            if(iter.hasNext())
            {
                iter.next();
                InPacket *inPacketPtr = iter.value();
                //送出一个接收包给WingController处理
                wingApp->packetProcesser->processInPacket(inPacketPtr);

                //打印调试信息
                DWHERE();
                DPRINT("- - - > longMainPtr->packetProcesser->processInPacket(inPacketPtr)");

                //包出队
                inPacketList.remove(iter.key());
            }

            //打印调试信息
            DWHERE();
            DPRINT("- - - > inPacketList.size():%d",inPacketList.size());

        }

        mutex.unlock();
    }

}
Exemple #17
0
WingUser::~WingUser()
{
	//打印调试信息
	DWHERE();
}
PacketProcesser::~PacketProcesser()
{
	//打印调试信息
	DWHERE();
}
WingTextBrowser::~WingTextBrowser()
{
	//打印调试信息
	DWHERE();
	DPRINT("- - - > WingTextBrowser was destructed! qqNum:%u",buddyQQNum);
}
void PacketProcesser::processInPacketSlot(InPacket *inPacket)
{
	//取得接收包的命令字
	short command = inPacket->getCommand();

	//打印调试信息
	DWHERE();
	DPRINT("- - - > new inpacket! command:%#x bodyLen:%d",command, inPacket->getBodyLen());

/*
#ifdef QT_DEBUG
	uint8 *bodyPtr = inPacket->getBody();
	int bodyLen = inPacket->getBodyLen();

	for(int i=0; i<bodyLen; i++)
	{
		if(!(i%8))
			fprintf(stderr, "\n%d: ", i);
		fprintf(stderr, "%2x ", bodyPtr[i]);
	}
	fprintf(stderr, "\n");
	fflush(stderr);
#endif
*/
	switch(command)
	{
			//处理握手请求应答 0x0091
		case QQ_TOUCH_REQUEST:
			//处理预登陆令箭请求应答 0x0062
		case QQ_REQUEST_PRE_LOGIN_TOKEN:
			//处理登陆令箭请求应答 0x00ba
		case QQ_REQUEST_LOGIN_TOKEN:
			//处理预会话密钥应答 0X00DD
		case QQ_REQUEST_PRE_SESSION_KEY:
			//处理会话密钥应答 0x0022
		case QQ_REQUEST_SESSION_KEY:
		{
			if(NULL != wingApp->loginModule)
				wingApp->loginModule->processReply(inPacket);
			else
				processUnknownMsg(inPacket);
		}
			break;
			//处理获取好友列表应答 0x0026
		case QQ_GET_FRIEND_LIST:
			processGetFriendListReply(inPacket);
			break;
			//处理获取在线好友应答 0x0027
		case QQ_GET_FRIEND_ONLINE:
			processGetOnlineFriendListReply(inPacket);
			break;
			//收到用户信息 0x0006
		case QQ_GET_USER_INFO:
			processGetUserInfoReply(inPacket);
			break;
			//保持在线(心跳信息)0x0002
		case QQ_KEEP_ALIVE:
			processKeepAliveReply(inPacket);
			break;
			//收到消息 0x0017
		case QQ_RECV_IM:
			processReceiveIM(inPacket);
			break;
			//收到发送消息的应答 0x0016
		case QQ_SEND_IM:
			processSendIMReply(inPacket);
			break;
			//收到好友状态改变信息 0x0081
		case QQ_FRIEND_CHANGE_STATUS:
			processFriendChangeStatus(inPacket);
			break;
			//收到用户状态改变应答信息 0x000D
		case QQ_CHANGE_STATUS:
			processUserChangeStatus(inPacket);
			break;
			//签名操作 0x0067
		case QQ_SIGNATURE_OP:
			processSignatureOpReply(inPacket);
			break;
		default:
			processUnknownMsg(inPacket);
	}
}
void ReceiveIMPacket::processUnknownIMPacket(InPacket *inPacket)
{
	//打印调试信息
	DWHERE();
	DPRINT("- - - > there is one IMPacket not be processed!");
}