This is not the best UI in the world...
---
 src/control.cpp             |   40 +++++++++++++++++++++++-
 src/control.h               |    6 ++--
 src/controlbase.ui          |   70 +++++++++++++++++++++++++++++++++++++++++++
 src/hardwaremanipulator.cpp |   19 ++++++++++-
 src/hardwaremanipulator.h   |    9 ++++--
 src/phonesim.cpp            |    2 +-
 6 files changed, 135 insertions(+), 11 deletions(-)

diff --git a/src/control.cpp b/src/control.cpp
index b897b9e..c14909f 100644
--- a/src/control.cpp
+++ b/src/control.cpp
@@ -68,6 +68,8 @@ private slots:
     void delVoicemail();
     void sendVMNotify( int type = 0 );
     void sendEVMNotify();
+    void sendUSSD();
+    void cancelUSSD();
 
 signals:
     void unsolicitedCommand(const QString &);
@@ -130,6 +132,8 @@ ControlWidget::ControlWidget(const QString &ruleFile, 
Control *parent)
     connect(ui->pbRemoveMessage, SIGNAL(clicked()), this, 
SLOT(delVoicemail()));
     connect(ui->pbNotifyUDH, SIGNAL(clicked()), this, SLOT(sendVMNotify()));
     connect(ui->pbNotifyUDHEnhanced, SIGNAL(clicked()), this, 
SLOT(sendEVMNotify()));
+    connect(ui->pbSendUSSD, SIGNAL(clicked()), this, SLOT(sendUSSD()));
+    connect(ui->pbCancelUSSD, SIGNAL(clicked()), this, SLOT(cancelUSSD()));
 
     QStringList headers;
     headers << "Sender" << "Priority" << "Notification Status";
@@ -145,8 +149,9 @@ void ControlWidget::closeEvent(QCloseEvent *event)
     hide();
 }
 
-Control::Control(const QString& ruleFile, QObject *parent)
-        : HardwareManipulator(parent), widget(new ControlWidget(ruleFile, 
this))
+Control::Control(const QString& ruleFile, SimRules *sr, QObject *parent)
+        : HardwareManipulator(sr, parent),
+        widget(new ControlWidget(ruleFile, this))
 {
     QList<QByteArray> proxySignals;
     proxySignals
@@ -339,6 +344,18 @@ void ControlWidget::handleToData( const QString& cmd )
             ui->atViewer->append( dataItem + " : " + 
translator->translateCommand(dataItem) );
         }
     }
+
+    if ( cmd.startsWith("AT+CUSD=") ) {
+        int comma = cmd.indexOf( QChar(',') );
+        if ( comma >= 0 ) {
+            QString content = cmd.mid(comma + 1);
+            content.remove( QChar('"') );
+            ui->lblResponse->setText( content );
+        }
+
+        if ( cmd.startsWith("AT+CUSD=2") )
+            ui->lblResponse->setText( "" );
+    }
 }
 
 void Control::handleToData( const QString& cmd )
@@ -437,3 +454,22 @@ ControlWidget::VoicemailItem::VoicemailItem( const QString 
&from, bool urgent )
 
     id = nextId++;
 }
+
+void ControlWidget::sendUSSD()
+{
+    bool ask = ui->chkAskResponse->isChecked();
+    QString text = ui->leUSSDString->text();
+
+    p->sendUSSD( false, ask, text );
+
+    ui->lblResponse->setText( "" );
+    ui->leUSSDString->setText( "" );
+}
+
+void ControlWidget::cancelUSSD()
+{
+    p->sendUSSD( true, false, "" );
+
+    ui->lblResponse->setText( "" );
+    ui->leUSSDString->setText( "" );
+}
diff --git a/src/control.h b/src/control.h
index 8d712fc..e8b20a9 100644
--- a/src/control.h
+++ b/src/control.h
@@ -29,7 +29,7 @@ class Control: public HardwareManipulator
 Q_OBJECT
 
 public:
-    Control(const QString& ruleFile, QObject *parent=0);
+    Control(const QString& ruleFile, SimRules *sr, QObject *parent=0);
     virtual ~Control();
 
 public slots:
@@ -48,8 +48,8 @@ private:
 class ControlFactory : public HardwareManipulatorFactory
 {
 public:
-    inline virtual HardwareManipulator *create(QObject *parent)
-        { return new Control(ruleFile(), parent); }
+    inline virtual HardwareManipulator *create(SimRules *sr, QObject *parent)
+        { return new Control(ruleFile(), sr, parent); }
 };
 
 
diff --git a/src/controlbase.ui b/src/controlbase.ui
index bdaf3b4..a0468f2 100644
--- a/src/controlbase.ui
+++ b/src/controlbase.ui
@@ -1300,6 +1300,76 @@ p, li { white-space: pre-wrap; }
        </item>
       </layout>
      </widget>
+     <widget class="QWidget" name="tab_5" >
+      <attribute name="title" >
+       <string>USSD</string>
+      </attribute>
+      <layout class="QVBoxLayout" >
+       <property name="spacing" >
+        <number>6</number>
+       </property>
+       <property name="leftMargin" >
+        <number>9</number>
+       </property>
+       <property name="topMargin" >
+        <number>9</number>
+       </property>
+       <property name="rightMargin" >
+        <number>9</number>
+       </property>
+       <property name="bottomMargin" >
+        <number>9</number>
+       </property>
+       <item>
+        <layout class="QGridLayout" >
+         <item row="0" column="0" >
+          <widget class="QCheckBox" name="chkAskResponse" >
+           <property name="text" >
+            <string>Request response</string>
+           </property>
+           <property name="checked" >
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="1" >
+          <widget class="QLineEdit" name="leUSSDString" >
+           <property name="inputMask" >
+            <string/>
+           </property>
+           <property name="maxLength" >
+            <number>120</number>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="2" >
+          <widget class="QPushButton" name="pbSendUSSD" >
+           <property name="text" >
+            <string>Send</string>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1" >
+          <widget class="QLabel" name="lblResponse" >
+           <property name="toolTip" >
+            <string>User response</string>
+           </property>
+           <property name="text" >
+            <string></string>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="2" >
+          <widget class="QPushButton" name="pbCancelUSSD" >
+           <property name="text" >
+            <string>Cancel session</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </widget>
     </widget>
    </item>
    <item>
diff --git a/src/hardwaremanipulator.cpp b/src/hardwaremanipulator.cpp
index b5d4465..61b98f3 100644
--- a/src/hardwaremanipulator.cpp
+++ b/src/hardwaremanipulator.cpp
@@ -26,6 +26,8 @@
 #include <qcbsmessage.h>
 #include <qgsmcodec.h>
 #include <qwsppdu.h>
+#include <qatutils.h>
+#include <phonesim.h>
 
 #define NIBBLE_MAX 15
 #define TWO_BYTE_MAX 65535
@@ -36,8 +38,8 @@
 #define ONE_CHAR 1
 #define HEX_BASE 16
 
-HardwareManipulator::HardwareManipulator(QObject *parent)
-        : QObject(parent)
+HardwareManipulator::HardwareManipulator(SimRules *sr, QObject *parent)
+        : QObject(parent), rules(sr)
 {
 }
 
@@ -275,3 +277,16 @@ void HardwareManipulator::sendVMNotify( int type, int 
count, const QList<QVMMess
 
     sendSMS( m );
 }
+
+void HardwareManipulator::sendUSSD( bool cancel, bool response,
+               const QString &content )
+{
+    QTextCodec *codec = QAtUtils::codec( rules->variable("SCS") );
+    /* TODO: if rules->variable("USD") == "0" then return */
+    if (cancel)
+        emit unsolicitedCommand( "+CUSD: 2" );
+    else
+        emit unsolicitedCommand( "+CUSD: " +
+                        QString::number( response ? 1 : 0 ) + ",\"" +
+                        QAtUtils::quote( content, codec ) + "\",0" );
+}
diff --git a/src/hardwaremanipulator.h b/src/hardwaremanipulator.h
index 64a8d8e..7b59167 100644
--- a/src/hardwaremanipulator.h
+++ b/src/hardwaremanipulator.h
@@ -26,12 +26,13 @@
 
 class QSMSMessage;
 class QVMMessage;
+class SimRules;
 class HardwareManipulator : public QObject
 {
 Q_OBJECT
 
 public:
-    HardwareManipulator(QObject *parent=0);
+    HardwareManipulator(SimRules *sr, QObject *parent=0);
     QSMSMessageList & getSMSList();
 
 public slots:
@@ -41,6 +42,7 @@ public slots:
     virtual void constructSMSMessage(const int type, const QString &sender, 
const QString &serviceCenter, const QString &text);
     virtual void sendSMS( const QSMSMessage& m );
     virtual void sendVMNotify( int type, int count, const QList<QVMMessage> 
&received, const QList<QVMMessage> &deleted, const QString &mailbox );
+    virtual void sendUSSD( bool cancel, bool response, const QString &content 
);
 
 signals:
     void unsolicitedCommand(const QString &cmd);
@@ -60,14 +62,15 @@ protected:
 
 private:
     QSMSMessageList SMSList;
+    SimRules *rules;
 };
 
 class HardwareManipulatorFactory
 {
 public:
     virtual ~HardwareManipulatorFactory() {};
-    inline virtual HardwareManipulator *create(QObject *p)
-           { return new HardwareManipulator(p); }
+    inline virtual HardwareManipulator *create(SimRules *sr, QObject *p)
+           { return new HardwareManipulator(sr, p); }
 
     QString ruleFile() const { return ruleFilename; }
     void setRuleFile(const QString& filename) { ruleFilename = filename; }
diff --git a/src/phonesim.cpp b/src/phonesim.cpp
index 885ff9f..a1d3546 100644
--- a/src/phonesim.cpp
+++ b/src/phonesim.cpp
@@ -503,7 +503,7 @@ SimRules::SimRules( int fd, QObject *p,  const QString& 
filename, HardwareManipu
     machine = 0;
 
     if (hmf)
-        machine = hmf->create(0);
+        machine = hmf->create(this, 0);
 
     if (machine) {
         connect(machine, SIGNAL(unsolicitedCommand(QString)),
-- 
1.6.1

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to