void HardwareManipulator::constructSMSMessage( const QString &sender, const QString &serviceCenter, const QString &text )
{
    QSMSMessage m;
    if ( sender.isEmpty() ) {
        warning(tr("Invalid Sender"),
                tr("Sender must not be empty"));
        return;
    }
    m.setSender(sender);

    if ( serviceCenter.contains(QRegExp("\\D")) ) {
        warning(tr("Invalid Service Center"),
                tr("Service Center must not be empty and contain "
                   "only digits"));
        return;
    }
    m.setServiceCenter(serviceCenter);

    m.setText(text);
    m.setTimestamp(QDateTime::currentDateTime());

    SMSList.appendSMS( m.toPdu() );
}
Beispiel #2
0
void SmsClient::newConnection()
{
    // XXX need better way to handle this.
    QSettings c("PhoneProfile"); // no tr
    c.beginGroup("Profiles"); // no tr
    bool planeMode = c.value("PlaneMode", false).toBool();
    smsSending = true;
    if (planeMode) {
        errorHandling(0, tr("Messages cannot be sent in Airplane Mode."));
        return;
    }

    QList<RawSms>::iterator rawMsg;
    for ( rawMsg = smsList.begin(); rawMsg != smsList.end(); rawMsg++) {
        QSMSMessage msg;

        //check for vcard over sms
        if (rawMsg->mimetype == QLatin1String("text/x-vCard")) {
            QString vcardData = rawMsg->body;
            //restore CR's stripped by composer
            vcardData.replace("\n","\r\n");
            msg.setApplicationData(vcardData.toLatin1());
            msg.setDestinationPort(9204);
        } else {
            msg.setText( rawMsg->body );
        }

        msg.setRecipient( rawMsg->number );

        QString smsKey = sender->send( msg );
        sentMessages.insert( smsKey, *rawMsg );
        ++total;
    }
    success = true;
    smsSending = false;
    smsList.clear();
}
Beispiel #3
0
void SmsReader::onRequestSmsCommand()
{
    AtCommand *cmd = qobject_cast<AtCommand*>(sender());
    if (cmd) {
        QHash<QString, QList<QSMSMessage> > multiSms;
        AtResult res = cmd->getCommandResult();
        if (res.resultCode() == AtResult::OK) {
            m_incomingMessages.clear();
            QStringList lines = res.content().split("\n");
            int messageId = -1;
            QRegExp messageIdExtractor("^\\+CMGL:\\s*(\\d+)");
            Q_FOREACH(const QString &line, lines) {
                if (messageId < 0) {
                    // expected "CMGL: 0,1,,123", where first number is messageId
                    if (messageIdExtractor.indexIn(line) >= 0) {
                        bool ok;
                        messageId = messageIdExtractor.cap(1).toInt(&ok);
                        if (!ok) {
                            messageId = -1;
                        }
                    }
                } else {
                    // expected pdu
                    QSMSMessage smsMsg = QSMSMessage::fromPdu(QByteArray::fromHex(line.toLatin1()));
                    if (!smsMsg.sender().isEmpty()) {
                        QString multiId;
                        uint part;
                        uint partCount;
                        smsMsg.setMessageIds({messageId});
                        if (getMultipartInfo(smsMsg, multiId, part, partCount)) {
                            smsMsg.setMessagePartNumber(part);
                            multiSms[multiId].append(smsMsg);
                        } else {
                            m_incomingMessages.append(smsMsg);
                        }
                    }
                    messageId = -1;
                }
            }
            QHashIterator<QString, QList<QSMSMessage> > it(multiSms);
            while (it.hasNext()) {
                it.next();
                QList<QSMSMessage> mess = it.value();
                if (mess.count() > 1) {
                    QString multiId;
                    uint part;
                    uint partCount;
                    if (getMultipartInfo(mess.at(0), multiId, part, partCount)) {
                        if (partCount == (uint)mess.count()) {
                            // we have all part of sms message
                            QList<int> smsIds;
                            qSort(mess.begin(), mess.end(), [](const QSMSMessage &m1, const QSMSMessage &m2) {
                                return m1.messagePartNumber() < m2.messagePartNumber();
                            });
                            QString smsText;
                            QSMSMessage newMes;
                            for (const QSMSMessage &smsMess : mess) {
                                smsIds.append(smsMess.messageIds().at(0));
                                smsText.append(smsMess.text());
                                newMes.setTimestamp(smsMess.timestamp());
                                newMes.setSender(smsMess.sender());
                            }
                            newMes.setText(smsText);
                            newMes.setMessageIds(smsIds);
                            m_incomingMessages.append(newMes);
                        }
                    }
                }
            }
            logMsg(QString("Request sms command: we have %0 sms").arg(m_incomingMessages.count()));
            if (count() > 0) {
                emit incomingSms();
            }
        } else {