⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recvsms.cpp

📁 QT是目前Linux上最知名的窗口环境系统
💻 CPP
字号:
// Protected by the GNU General Public License#include "recvsms.h"vector<IncomingMessage> newMessages;void EventHandler::SMSReception(SMSMessageRef newMessage, SMSMessageType messageType){	IncomingMessage m;	m._messageType = messageType;	m._newSMSMessage = newMessage;	newMessages.push_back(m);}void EventHandler::CBReception(CBMessageRef newMessage){	IncomingMessage m;	m._messageType = GsmEvent::CellBroadcastSMS;	m._newCBMessage = newMessage;	newMessages.push_back(m);}void EventHandler::SMSReceptionIndication(string storeName, unsigned int index, SMSMessageType messageType){	IncomingMessage m;	m._index = index;	m._storeName = storeName;	m._messageType = messageType;	newMessages.push_back(m);}RecvThread::RecvThread(QObject *r, QMutex *m, QWaitCondition *c) : receiver(r), mutex(m), condition(c), done(FALSE){	enableSMS = true;	enableCB = true;	enableStat = false;	flushSMS = false;	onlyReceptionIndication = true;}void RecvThread::stop(){	mutex->lock();	done = TRUE;	mutex->unlock();}void RecvThread::run(){	done = FALSE;		newConnect();		while (!done)	{			newSMSs();			}		disConnect();}void RecvThread::newConnect(){	string device = "/dev/ttyS0";	string baudrate = "57600";	string initString = DEFAULT_INIT_STRING;	bool swHandshake = false;	me = new MeTa( (new UnixSerialPort(device,  baudrate == "" ? DEFAULT_BAUD_RATE : baudRateStrToSpeed(baudrate), initString, swHandshake)) );		// set default SMS store if -t option was given	if (storeName != "")			me->setSMSStore(storeName, 3);	if (flushSMS)		flushSMSs();			// switch message service level to 1 this enables SMS routing to TA	me->setMessageService(1);	// switch on SMS routing	me->setSMSRoutingToTA(enableSMS, enableCB, enableStat, onlyReceptionIndication);	// register event handler	me->setEventHandler(new EventHandler());	}void RecvThread::flushSMSs(){	SMSStoreRef store = me->getSMSStore(storeName);	for (SMSStore::iterator s = store->begin(); s != store->end(); ++s)	{		if (! s->empty())		{			string result =  "Type of message: ";						switch (s->message()->messageType())			{			case SMSMessage::SMS_DELIVER:				result += "SMS message\n";				break;			case SMSMessage::SMS_SUBMIT_REPORT:				result += "submit report message\n";				break;			case SMSMessage::SMS_STATUS_REPORT:				result += "status report message\n";				break;			}						result += s->message()->toString();			RecvEvent *re = new RecvEvent(result.c_str());			QThread::postEvent(receiver, re);					store->erase(s);		}	}}void RecvThread::newSMSs(){	struct timeval timeoutVal;	timeoutVal.tv_sec = 5;	timeoutVal.tv_usec = 0;	RecvEvent *re = new RecvEvent("");	QThread::postEvent(receiver, re);	me->waitEvent(&timeoutVal);	// if it returns, there was an event or a timeout	while (newMessages.size() > 0)	{		mutex->lock();		// get first new message and remove it from the vector		SMSMessageRef newSMSMessage = newMessages.begin()->_newSMSMessage;		CBMessageRef newCBMessage = newMessages.begin()->_newCBMessage;		GsmEvent::SMSMessageType messageType = newMessages.begin()->_messageType;		int index = newMessages.begin()->_index;		string storeName = newMessages.begin()->_storeName;		newMessages.erase(newMessages.begin());		// process the new message		string result = "Type of message: ";		switch (messageType)		{		case GsmEvent::NormalSMS:			result += "SMS message\n";			break;		case GsmEvent::CellBroadcastSMS:			result += "cell broadcast message\n";			break;		case GsmEvent::StatusReportSMS:			result += "status report message\n";			break;		}			if (! newSMSMessage.isnull())			result += newSMSMessage->toString();		else if (! newCBMessage.isnull())			result += newCBMessage->toString();		else		{			SMSStoreRef store = me->getSMSStore(storeName);			if (messageType == GsmEvent::CellBroadcastSMS)				result += (*store.getptr())[index].cbMessage()->toString();			else				result += (*store.getptr())[index].message()->toString();			store->erase(store->begin() + index);		}		mutex->unlock();		// call the action		RecvEvent *re = new RecvEvent(result.c_str());		QThread::postEvent(receiver, re);		}}void RecvThread::disConnect(){	me->setSMSRoutingToTA(false, false, false);	delete me;}RecvSMS::RecvSMS(){		recv = 0;	stopped = FALSE;	}RecvSMS::~RecvSMS(){	recv = 0;}void RecvSMS::errorHandling(int error){	emit updateStatus("Error Occured");	emit errorOccurred(error);}void RecvSMS::kill(){	if (recv) 	{		delete recv;			}		delete this;}void RecvSMS::go(){	stopped = FALSE;    		mutex.lock();  	// start the consumer first	if (! recv)	{		recv = new RecvThread(this, &mutex, &condition);	}	recv->start();	// wait for consumer to signal that it has started	//condition.wait(&mutex);	mutex.unlock();}void RecvSMS::stop(){	if (recv && recv->running()) 	{		recv->stop();		condition.wakeAll();		recv->wait();	}	stopped = TRUE;   	kill();}void RecvSMS::customEvent(QCustomEvent *e){	switch (e->type()) 	{	case QEvent::User + 100:		// ProdEvent				RecvEvent *re = (RecvEvent *) e;				if ((re->str()).isEmpty() == false)		{			emit newMessage(re->str());			emit updateStatus("New SMS");		}		break;		}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -