ussdd support
[ussd-widget] / ussd-common / src / usr / bin / ussdquery.py
index db88dd3..2705dad 100755 (executable)
@@ -15,6 +15,8 @@ import re
 import fcntl
 import os
 import stat
+import dbus
+import gobject
 
 # Needed for correct output of utf-8 symbols.
 sys.stdout=file("/dev/stdout", "wb")
@@ -32,7 +34,9 @@ if len(sys.argv) == 1:
 "Options:\n-l language. Allowed languages: German, English, Italian, French, Spanish, Dutch, Swedish, Danish, Portuguese, Finnish, Norwegian, Greek, Turkish, Reserved1, Reserved2, Unspecified\n"+\
 "-r retry count. 0 default. Use -1 for infinite.\n-f If specified, errors, which occur on last query are threated as fatal\n"+\
 "-t timeout in seconds. Default 30. Timeout is considered to be critical error because you can't be sure answer for what request was returned.\n"+\
-"-d delimeter. Default is '\\n> '"+\
+"-d delimeter. Default is '\\n> \n'"+\
+"-m gain modem lock imidiately '"+\
+"-s show GUI message box on last reply"+\
 "For USSD menu navigation divide USSD number via spacebars for every next menu selection. Type exit in interactive mode to exit."
     sys.exit()
 
@@ -111,6 +115,7 @@ allow_last_error = True
 delimiter = "\n> "
 language = 15
 timeout = 30
+show_qussd = False
 
 if sys.argv[1] == "interactive":
        number = "interactive"
@@ -121,6 +126,8 @@ else:
                        print >> sys.stderr, "Syntax error in USSD number."
                        sys.exit(-7)
 
+modem = None
+
 # Parsing command line options
 arg = 1
 state = "arg"
@@ -142,6 +149,12 @@ while arg < len(sys.argv)-1:
                if sys.argv[arg] == "-f":
                        allow_last_error = False
                        continue
+               if sys.argv[arg] == "-s":
+                       show_qussd = True
+                       continue
+               if sys.argv[arg] == "-m":
+                       modem = init_modem(modem)
+                       continue
 
        if state == "lang":
                if sys.argv[arg] == "German":
@@ -219,7 +232,9 @@ if retry == -1:
 else:
        retry_forever = False
 
-modem = None
+bus = dbus.SystemBus()
+ussdd = bus.get_object("su.kibergus.ussdd", "/su/kibergus/ussdd")
+ussdd_int = dbus.Interface(ussdd, "su.kibergus.ussdd")
 
 # Now we are ready to send commands
 
@@ -228,13 +243,11 @@ if number == "interactive":
        sys.stdout.write(delimiter)
        sys.stdout.flush()
 while number == "interactive" or stage < len(number):
-       if modem == None:
-               modem = init_modem(modem)
-
        if number == "interactive":
                cnumber = sys.stdin.readline().strip()
                if cnumber == "exit":
-                       close_modem (modem)
+                       if modem != None:
+                               close_modem (modem)
                        sys.exit (0)
                if not check_number (cnumber):
                        sys.stdout.write ("Syntax error in USSD number"+delimiter)
@@ -243,11 +256,17 @@ while number == "interactive" or stage < len(number):
        else:
                cnumber = number[stage]
 
+       if modem == None:
+               modem = init_modem(modem)
+
        if retry == -1 and not retry_forever:
                print >> sys.stderr, "Retry limit is over. Giving up."
                break
 
        try :
+               if number != "interactive" and not show_qussd or stage != len(number)-1:
+                       ussdd_int.skip_next()
+
                modem.send('at+cusd=1,"'+cnumber+'",'+str(language)+'\r')
                # Read our query echoed back
                modem.readline()
@@ -260,11 +279,13 @@ while number == "interactive" or stage < len(number):
        except pexpect.TIMEOUT:
                print >> sys.stderr, "Timeout. Modem didn't reply."
                close_modem (modem)
+               ussdd_int.show_next()
                sys.exit (-2)
 
        if replystring.strip() == "ERROR" :
                retry -= 1
                print >> sys.stderr, "Modem returned ERROR. Query not executed."
+               ussdd_int.show_next()
                continue
 
        try: