📄 recvsms.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 + -