USSD menu navigation implementation
authorkibergus <kibergus@gmail.com>
Thu, 4 Feb 2010 07:40:11 +0000 (07:40 +0000)
committerkibergus <kibergus@gmail.com>
Thu, 4 Feb 2010 07:40:11 +0000 (07:40 +0000)
git-svn-id: file:///svnroot/ussd-widget/trunk@20 d197f4d6-dc93-42ad-8354-0da1f58e353f

ussd-common/build_ussd-common.py
ussd-common/src/usr/bin/ussdquery.py
ussd-widget/build_ussd-widget.py
ussd-widget/ru.po
ussd-widget/src/usr/lib/hildon-desktop/ussd-widget.py
ussd-widget/src/usr/share/locale/ru/LC_MESSAGES/ussd-widget.mo

index 2b6e350..c15da53 100644 (file)
@@ -20,7 +20,7 @@ if __name__ == "__main__":
     print
 
     p=py2deb.Py2deb("ussd-common")
-    p.description="Command line utility for makein USSD queries"
+    p.description="Command line utility for making USSD queries"
     p.author="Alexey Guseynov"
     p.mail="kibergus@gmail.com"
     p.depends = "python2.5, pexpect"
@@ -38,9 +38,9 @@ if __name__ == "__main__":
 chmod +s /usr/bin/pnatd
 """ #Set here your post install script
 
-    version = "0.0.3"
+    version = "0.0.5"
     build = "0" 
-    changeloginformation = "Language selection support, line break in reply bug fixed." 
+    changeloginformation = "command line parameters rearranged, bugfixes." 
    
     dir_name = "src"     
 
index 1798ae7..e414752 100755 (executable)
@@ -13,58 +13,150 @@ import sys
 import gsmdecode
 import re
 import fcntl
-
-if len(sys.argv) != 2 and len(sys.argv) != 3:
-    print "Usage: ussdquery.py <ussd number> [<language>]\nAllowed languages: German, English, Italian, French, Spanish, Dutch, Swedish, Danish, Portuguese, Finnish, Norwegian, Greek, Turkish, Reserved1, Reserved2, Unspecified"
+import os
+import stat
+
+def check_number(number):
+       if number == "":
+               return False
+       for s in number :
+               if not (s in ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "+", "*", "#"]) :
+                       return False
+       return True
+
+if len(sys.argv) == 1:
+    print "Usage:\nussdquery.py <ussd number> [options]\nussdquery.py interactive [options]\n"+\
+"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 shure answer for what request was returned.\n"+\
+"-d delimeter. Default is '\\n> '"+\
+"For USSD menu navigation divide USSD number via spacebars for every nex menu selection. Type exit in interactive mode to exit."
     sys.exit()
 
+retry = 0
+allow_last_error = True
+delimiter = "\n> "
 language = 15
-if len(sys.argv) == 3:
-       if sys.argv[2] == "German":
-               language = 0
-       elif sys.argv[2] == "English":
-               language = 1
-       elif sys.argv[2] == "Italian":
-               language = 2
-       elif sys.argv[2] == "French":
-               language = 3
-       elif sys.argv[2] == "Spanish":
-               language = 4
-       elif sys.argv[2] == "Dutch":
-               language = 5
-       elif sys.argv[2] == "Swedish":
-               language = 6
-       elif sys.argv[2] == "Danish":
-               language = 7
-       elif sys.argv[2] == "Portuguese":
-               language = 8
-       elif sys.argv[2] == "Finnish":
-               language = 9
-       elif sys.argv[2] == "Norwegian":
-               language = 10
-       elif sys.argv[2] == "Greek":
-               language = 11
-       elif sys.argv[2] == "Turkish":
-               language = 12
-       elif sys.argv[2] == "Reserved1":
-               language = 13
-       elif sys.argv[2] == "Reserved2":
-               language = 14
-       elif sys.argv[2] == "Unspecified":
-               language = 15
-       else:
-               print >> sys.stderr, "Language unknown, falling back to unspecified."
+timeout = 30
+
+if sys.argv[1] == "interactive":
+       number = "interactive"
+else:
+       number = sys.argv[1].split(" ")
+       for n in number: 
+               if not check_number(n):
+                       print >> sys.stderr, "Sintax error in USSD number."
+                       sys.exit(-7)
+
+# Parsing command line options
+arg = 1
+state = "arg"
+while arg < len(sys.argv)-1:
+       arg += 1
+       if state == "arg":
+               if sys.argv[arg] == "-l":
+                       state = "lang"
+                       continue
+               if sys.argv[arg] == "-r":
+                       state = "retry"
+                       continue
+               if sys.argv[arg] == "-t":
+                       state = "timeout"
+                       continue
+               if sys.argv[arg] == "-d":
+                       state = "delim"
+                       continue
+               if sys.argv[arg] == "-f":
+                       allow_last_error = False
+                       continue
+
+       if state == "lang":
+               if sys.argv[arg] == "German":
+                       language = 0
+               elif sys.argv[arg] == "English":
+                       language = 1
+               elif sys.argv[arg] == "Italian":
+                       language = 2
+               elif sys.argv[arg] == "French":
+                       language = 3
+               elif sys.argv[arg] == "Spanish":
+                       language = 4
+               elif sys.argv[arg] == "Dutch":
+                       language = 5
+               elif sys.argv[arg] == "Swedish":
+                       language = 6
+               elif sys.argv[arg] == "Danish":
+                       language = 7
+               elif sys.argv[arg] == "Portuguese":
+                       language = 8
+               elif sys.argv[arg] == "Finnish":
+                       language = 9
+               elif sys.argv[arg] == "Norwegian":
+                       language = 10
+               elif sys.argv[arg] == "Greek":
+                       language = 11
+               elif sys.argv[arg] == "Turkish":
+                       language = 12
+               elif sys.argv[arg] == "Reserved1":
+                       language = 13
+               elif sys.argv[arg] == "Reserved2":
+                       language = 14
+               elif sys.argv[arg] == "Unspecified":
+                       language = 15
+               else:
+                       print >> sys.stderr, "Language unknown, falling back to unspecified."
+               state = "arg"
+               continue
+
+       if state == "delim":
+               if number == "interactive":
+                       delimiter = sys.argv[arg]
+               else:
+                       print >> sys.stderr, "Delimiter is only supported in interactive mode."
+               state = "arg"
+               continue
+
+       if state == "retry":
+               if number == "interactive":
+                       print >> sys.stderr, "Retry is only supported in normal mode."
+               else:
+                       try:
+                               retry = int(sys.argv[arg])
+                               if retry < -1:
+                                       print >> sys.stderr, "Number of allowed errors must be >= -1. -1 assumed."
+                                       retry = -1
+                       except:
+                               print >> sys.stderr, "Retry must be an integer."
+                               sys.exit(-5)
+               state = "arg"
+               continue
+       if state == "timeout":
+               try:
+                       timeout = int(sys.argv[arg])
+               except:
+                       print >> sys.stderr, "Timeout must be an integer."
+                       sys.exit(-5)
+               state = "arg"
+               continue
+
+       print >> sys.stderr, "Unrecogmized argument: "+sys.argv[arg]
+       
+if retry == -1:
+       retry_forever = True
+else:
+       retry_forever = False
 
 # We have only one modem, simultaneous acces wouldn't bring anything good
 lockf = open("/tmp/ussdquery.lock", 'a')
 fcntl.flock(lockf,fcntl.LOCK_EX)
-
-# Operations should timeout in 30 seconds.
-# I'm not shure, that readline uses timeouts
+try:
+       os.chmod("/tmp/ussdquery.lock", stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH)
+except:
+       None
 child = None
 response = ""
-retry = 5
-while response != "OK" and retry > 0 :
+init_retry = 5
+while response != "OK" and init_retry > 0 :
        if child == None :
                # OK response should be recieved shortly
                child = pexpect.spawn('pnatd', [], 2)
@@ -80,7 +172,7 @@ while response != "OK" and retry > 0 :
                response = ""
        if response != "OK" :
                time.sleep(0.5)
-               retry -= 1
+               init_retry -= 1
 
 if response != "OK" :
        print >> sys.stderr, "Couldn't init modem."
@@ -90,42 +182,74 @@ if response != "OK" :
         lockf.close()
        sys.exit (-1)
 
-child.timeout = 30
-
-try :
-       child.send('at+cusd=1,"'+(sys.argv[1])+'",'+str(language)+'\r')
-       # Read our query echoed back
-       child.readline()
-
-       #Read and parse reply
-       replystring = child.readline().decode('string_escape')
-except pexpect.TIMEOUT:
-       print >> sys.stderr, "Timeout. Modem didn't reply."
-       child.kill(9)
-        fcntl.flock(lockf,fcntl.LOCK_UN)
-        lockf.close()
-       sys.exit (-2)
-
-child.sendeof()
-fcntl.flock(lockf,fcntl.LOCK_UN)
-lockf.close()
+child.timeout = timeout
+# Now we are ready to send commands
+
+stage = 0
+if number == "interactive":
+       sys.stdout.write(delimiter)
+while number == "interactive" or stage < len(number):
+       if number == "interactive":
+               cnumber = sys.stdin.readline().strip()
+               if cnumber == "exit":
+                       child.kill(9)
+                       fcntl.flock(lockf,fcntl.LOCK_UN)
+                       lockf.close()
+                       sys.exit (-2)
+               if not check_number (cnumber):
+                       sys.stdout.write ("Sintax error in USSD number"+delimiter)
+                       continue
+       else:
+               cnumber = number[stage]
 
-#replystring = "+CUSD: 0,\"OCTATOK 165.65 p.\n 3BOHu 333! HOBbIu PA3DEL: ХuT-nAPAD MY3bIKu (3p. MuHYTA)\",1"
+       if retry == -1 and not retry_forever:
+               print >> sys.stderr, "Retry limit is over. Giving up."
+               break
 
-if replystring.strip() == "ERROR" :
-       print >> sys.stderr, "Modem returned ERROR. Query not executed."
-       sys.exit (-3)
+       try :
+               child.send('at+cusd=1,"'+cnumber+'",'+str(language)+'\r')
+               # Read our query echoed back
+               child.readline()
+
+               #Read and parse reply
+               replystring = child.readline().decode('string_escape')
+               # This will read out unneeded info from modem
+               child.readline()
+               child.readline()
+       except pexpect.TIMEOUT:
+               print >> sys.stderr, "Timeout. Modem didn't reply."
+               child.kill(9)
+               fcntl.flock(lockf,fcntl.LOCK_UN)
+               lockf.close()
+               sys.exit (-2)
 
-try:
-       reresult = re.match("(?s)^\\+CUSD: \\d+,\"(.*)\",(\\d+)$", replystring.strip())
-       reply = reresult.group(1)
-       encoding = reresult.group(2)
-except:
-       print >> sys.stderr, "Couldn't parse modem answer."
-       sys.exit (-4)
+       if replystring.strip() == "ERROR" :
+               retry -= 1
+               print >> sys.stderr, "Modem returned ERROR. Query not executed."
+               continue
+
+       try:
+               reresult = re.match("(?s)^\\+CUSD: \\d+,\"(.*)\",(\\d+)$", replystring.strip())
+               reply = reresult.group(1)
+               encoding = reresult.group(2)
+       except:
+               retry -= 1
+               print >> sys.stderr, "Couldn't parse modem answer."
+               continue
 
-# Decoding ansver
-reply = gsmdecode.decode(reply, int(encoding))
+       # Decoding ansver
+       reply = gsmdecode.decode(reply, int(encoding))
 
-print reply
+       if number == "interactive":
+               # prints line feed
+               sys.stdout.write(reply+delimiter)
+       else:
+               if stage == len(number)-1:
+                       print reply
+       stage += 1
+       if not allow_last_error and namber != "interactive" and stage == len(number) - 1:
+               retry = 0
 
+child.sendeof()
+fcntl.flock(lockf,fcntl.LOCK_UN)
+lockf.close()
index 0a3af93..82be314 100644 (file)
@@ -23,7 +23,7 @@ if __name__ == "__main__":
     p.description="Widget, that executes USSD query and displays response text\nThe main purpose is viewing your balance. In Russia all operators provide balace information via USSD queries and most part of contracts are prepaid. Ability to see your balance on desktop can be useful in such case.\nAnyway, you can configure widget to any other USSD query."
     p.author="Alexey Guseynov"
     p.mail="kibergus@gmail.com"
-    p.depends = "python2.5, ussd-common (>=0.0.3), python-hildondesktop (>=0.1.0-1maemo2), hildon-desktop-python-loader (>=0.1.0-1maemo2), python-gtk2, python-gobject, python-hildon, python-cairo"
+    p.depends = "python2.5, ussd-common (>=0.0.4), python-hildondesktop (>=0.1.0-1maemo2), hildon-desktop-python-loader (>=0.1.0-1maemo2), python-gtk2, python-gobject, python-hildon, python-cairo"
     p.section="user/desktop"
     p.icon = "./ussd-widget.png"
     p.arch="all"                #should be all for python, any for all arch
@@ -34,9 +34,9 @@ if __name__ == "__main__":
 #    p.postinstall="""#!/bin/sh
 #""" #Set here your post install script
 
-    version = "0.1.0"
+    version = "0.1.1"
     build = "0" 
-    changeloginformation = "Banner support." 
+    changeloginformation = "USSD menu support." 
    
     dir_name = "src"   
 
index 86f19c3..dcc5e42 100644 (file)
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.0.6\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-31 11:57+0300\n"
+"POT-Creation-Date: 2010-02-04 10:20+0300\n"
 "PO-Revision-Date: 2010-01-29 17:51+0300\n"
 "Last-Translator: Alexey Guseunov <kibergusBarkBarkgmail.com>\n"
 "Language-Team: Russian\n"
@@ -14,175 +14,187 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: utf-8\n"
 
-#: ussd-widget.py:35 ussd-widget.py:289
+#: src/usr/lib/hildon-desktop/ussd-widget.py:35
+#: src/usr/lib/hildon-desktop/ussd-widget.py:289
 msgid "Click to update"
 msgstr "Обновить"
 
-#: ussd-widget.py:59
+#: src/usr/lib/hildon-desktop/ussd-widget.py:59
 msgid "Couldn't read previous config"
 msgstr "Не удается прочитать предыдущий конфигурационный файл"
 
-#: ussd-widget.py:120
+#: src/usr/lib/hildon-desktop/ussd-widget.py:120
 #, python-format
 msgid "Error reading config on line %(line)d. = or # expected."
 msgstr ""
 "Ошибка чтения конфигурационного файла на %(line)d строке. Ожидалось = или #."
 
-#: ussd-widget.py:135 ussd-widget.py:144 ussd-widget.py:161 ussd-widget.py:202
+#: src/usr/lib/hildon-desktop/ussd-widget.py:135
+#: src/usr/lib/hildon-desktop/ussd-widget.py:144
+#: src/usr/lib/hildon-desktop/ussd-widget.py:161
+#: src/usr/lib/hildon-desktop/ussd-widget.py:202
 #, python-format
 msgid "Error reading config on line %(line)d. Integer expected."
 msgstr ""
 "Ошибка чтения конфигурационного файла на %(line)d строке. Ожидалось целое "
 "число."
 
-#: ussd-widget.py:172
+#: src/usr/lib/hildon-desktop/ussd-widget.py:172
 #, python-format
 msgid "Error reading config on line %(line)d. Pango font description expected."
 msgstr ""
 "Ошибка чтения конфигурационного файла на %(line)d строке. Ожидалось pango "
 "описание шрифта."
 
-#: ussd-widget.py:179 ussd-widget.py:185
+#: src/usr/lib/hildon-desktop/ussd-widget.py:179
+#: src/usr/lib/hildon-desktop/ussd-widget.py:185
 #, python-format
 msgid "Error reading config on line %(line)d. Expected color definition."
-msgstr "Ошибка чтения конфигурационного файла на строке %(line)d. Ожидалось описание цвета."
+msgstr ""
+"Ошибка чтения конфигурационного файла на строке %(line)d. Ожидалось описание "
+"цвета."
 
-#: ussd-widget.py:199
+#: src/usr/lib/hildon-desktop/ussd-widget.py:199
 #, python-format
 msgid "Error reading config on line %(line)d. Unknown language code."
 msgstr ""
 "Ошибка чтения конфигурационного файла на %(line)d строке. Неизвестный код "
 "языка."
 
-#: ussd-widget.py:205
+#: src/usr/lib/hildon-desktop/ussd-widget.py:205
 #, python-format
 msgid "Error reading config on line %(line)d. Unexpected variable: "
 msgstr ""
 "Ошибка чтения конфигурационного файла на %(line)d строке. Неизвестная "
 "переменная: "
 
-#: ussd-widget.py:212 ussd-widget.py:217
+#: src/usr/lib/hildon-desktop/ussd-widget.py:212
+#: src/usr/lib/hildon-desktop/ussd-widget.py:217
 msgid "Config error"
 msgstr "Ошибка конфигурации"
 
-#: ussd-widget.py:218
+#: src/usr/lib/hildon-desktop/ussd-widget.py:218
 msgid "IO error while reading config"
 msgstr "Ошибка ввода/вывода при чтении конфигурационного файла"
 
-#: ussd-widget.py:307
+#: src/usr/lib/hildon-desktop/ussd-widget.py:307
 msgid "serious problems in program logic"
 msgstr "серьезная проблема в логике программы"
 
-#: ussd-widget.py:325
+#: src/usr/lib/hildon-desktop/ussd-widget.py:325
 msgid "Processing"
 msgstr "Обрабатываю"
 
-#: ussd-widget.py:330
+#: src/usr/lib/hildon-desktop/ussd-widget.py:330
 msgid "No config"
 msgstr "Нет конфигурации"
 
-#: ussd-widget.py:337
+#: src/usr/lib/hildon-desktop/ussd-widget.py:337
 msgid "Error"
 msgstr "Ошибка"
 
-#: ussd-widget.py:352
+#: src/usr/lib/hildon-desktop/ussd-widget.py:352
 msgid "Regexp Error: "
 msgstr "Ошибка в регулярном выражении: "
 
-#: ussd-widget.py:361
+#: src/usr/lib/hildon-desktop/ussd-widget.py:361
 msgid "Couldn't exec banner parser:"
 msgstr "Не удалось запустить обработчик для баннера:"
 
-#: ussd-widget.py:369
+#: src/usr/lib/hildon-desktop/ussd-widget.py:369
 msgid "Couldn't exec widget parser:"
 msgstr "Не удалось запустить обработчик для виджета:"
 
-#: ussd-widget.py:376
+#: src/usr/lib/hildon-desktop/ussd-widget.py:376
 msgid "Couldn't exec chain:"
 msgstr "Не удалось запустить следующее звено:"
 
-#: ussd-widget.py:406
+#: src/usr/lib/hildon-desktop/ussd-widget.py:406
 msgid "OK"
 msgstr "OK"
 
-#: ussd-widget.py:415
+#: src/usr/lib/hildon-desktop/ussd-widget.py:415
 msgid "USSD widget"
 msgstr "USSD виджет"
 
-#: ussd-widget.py:417
+#: src/usr/lib/hildon-desktop/ussd-widget.py:417
 msgid "Save"
 msgstr "Сохранить"
 
-#: ussd-widget.py:448
+#: src/usr/lib/hildon-desktop/ussd-widget.py:448
 msgid "USSD reply language"
 msgstr "Язык USSD ответа"
 
-#: ussd-widget.py:453
+#: src/usr/lib/hildon-desktop/ussd-widget.py:453
 msgid "Enable banner. Parser:"
 msgstr "Включить баннер. Обработчик:"
 
-#: ussd-widget.py:463
+#: src/usr/lib/hildon-desktop/ussd-widget.py:463
 msgid "Execute query on start"
 msgstr "Выполнять запрос при старте"
 
-#: ussd-widget.py:466
+#: src/usr/lib/hildon-desktop/ussd-widget.py:466
 msgid "Font"
 msgstr "Шрифт"
 
-#: ussd-widget.py:469
+#: src/usr/lib/hildon-desktop/ussd-widget.py:469
 msgid "Background color"
 msgstr "Цвет фона"
 
-#: ussd-widget.py:471
+#: src/usr/lib/hildon-desktop/ussd-widget.py:471
 msgid "Text color"
 msgstr "Цвет шрифта"
 
-#: ussd-widget.py:495
+#: src/usr/lib/hildon-desktop/ussd-widget.py:498
 msgid "USSD number"
 msgstr "USSD номер"
 
-#: ussd-widget.py:508
+#: src/usr/lib/hildon-desktop/ussd-widget.py:513
 msgid "Name"
 msgstr "Имя"
 
-#: ussd-widget.py:517
+#: src/usr/lib/hildon-desktop/ussd-widget.py:522
 msgid "Parser for widget"
 msgstr "Обработчик для виджета"
 
-#: ussd-widget.py:537
+#: src/usr/lib/hildon-desktop/ussd-widget.py:540
 msgid "Chain"
 msgstr "Следующее звено"
 
-#: ussd-widget.py:547
+#: src/usr/lib/hildon-desktop/ussd-widget.py:550
 msgid "RegExp"
 msgstr "Регулярное выражение"
 
-#: ussd-widget.py:557
+#: src/usr/lib/hildon-desktop/ussd-widget.py:560
 msgid "Max. width"
 msgstr "Макс. ширина"
 
-#: ussd-widget.py:559
+#: src/usr/lib/hildon-desktop/ussd-widget.py:562
 msgid "symbols"
 msgstr "символов"
 
-#: ussd-widget.py:569
+#: src/usr/lib/hildon-desktop/ussd-widget.py:572
 msgid "Update every"
 msgstr "Обновлять каждые"
 
-#: ussd-widget.py:571
+#: src/usr/lib/hildon-desktop/ussd-widget.py:574
 msgid "minutes"
 msgstr "минут"
 
-#: ussd-widget.py:581
+#: src/usr/lib/hildon-desktop/ussd-widget.py:584
 msgid "Retry pattern"
 msgstr "Шаблон повторных запросов"
 
-#: ussd-widget.py:601 ussd-widget.py:606 ussd-widget.py:611 ussd-widget.py:616
-#: ussd-widget.py:621
+#: src/usr/lib/hildon-desktop/ussd-widget.py:604
+#: src/usr/lib/hildon-desktop/ussd-widget.py:609
+#: src/usr/lib/hildon-desktop/ussd-widget.py:614
+#: src/usr/lib/hildon-desktop/ussd-widget.py:619
+#: src/usr/lib/hildon-desktop/ussd-widget.py:624
+#: src/usr/lib/hildon-desktop/ussd-widget.py:629
 msgid "Format help"
 msgstr "Справка по формату"
 
-#: ussd-widget.py:601
+#: src/usr/lib/hildon-desktop/ussd-widget.py:604
 msgid ""
 "Reply would be passed to specified utility, output of utility would be shown "
 "to you on widget.\n"
@@ -193,15 +205,17 @@ msgid ""
 "space delimits command line parameters of utility\n"
 "      Hint: use echo \"Your string %\" to prepend your string to reply."
 msgstr ""
-"Ответ будет передан указанной утилите, а её вывод будет отображен на виджете.\n"
+"Ответ будет передан указанной утилите, а её вывод будет отображен на "
+"виджете.\n"
 "       Формат:\n"
 "% будет заменен ответом\n"
 "\\ отменяет особое значение следующего символа\n"
 "\" и ' работают как обычно\n"
 "пробелы разделяют аргументы командной строки утилиты\n"
-"      Подсказка: используйте echo \"Ваша строка %\" чтобы поместить вашу строку перед ответом."
+"      Подсказка: используйте echo \"Ваша строка %\" чтобы поместить вашу "
+"строку перед ответом."
 
-#: ussd-widget.py:606
+#: src/usr/lib/hildon-desktop/ussd-widget.py:609
 msgid ""
 "Reply would be passed to specified utility, output of utility would be shown "
 "to you on banner.\n"
@@ -212,15 +226,16 @@ msgid ""
 "space delimits command line parameters of utility\n"
 "      Hint: use echo \"Your string %\" to prepend your string to reply."
 msgstr ""
-"Ответ будет передан указанной утилите, а её вывод будет отображен на баннере.\n"
+"Ответ будет передан указанной утилите, а её вывод будет отображен на "
+"баннере.\n"
 "       Формат:\n"
 "% будет заменен ответом\n"
 "\\ отменяет особое значение следующего символа\n"
 "\" и ' работают как обычно\n"
-"пробелы разделяют аргументы командной строки утилиты"
-"      Подсказка: используйте echo \"Ваша строка %\" чтобы поместить вашу строку перед ответом."
+"пробелы разделяют аргументы командной строки утилиты      Подсказка: "
+"используйте echo \"Ваша строка %\" чтобы поместить вашу строку перед ответом."
 
-#: ussd-widget.py:611
+#: src/usr/lib/hildon-desktop/ussd-widget.py:614
 msgid ""
 "Reply would be passed to specified utility after parser utility. May be used "
 "for logging, statistics etc.\n"
@@ -238,7 +253,7 @@ msgstr ""
 "\" и ' работают как обычно\n"
 "пробелы разделяют аргументы командной строки утилиты"
 
-#: ussd-widget.py:616
+#: src/usr/lib/hildon-desktop/ussd-widget.py:619
 msgid ""
 "Standard python regexps. Use\n"
 " (.+?[\\d\\,\\.]+)\n"
@@ -248,7 +263,7 @@ msgstr ""
 " (.+?[\\d\\,\\.]+)\n"
 " чтобы удалить все после первого числа."
 
-#: ussd-widget.py:621
+#: src/usr/lib/hildon-desktop/ussd-widget.py:624
 msgid ""
 "Pauses between attemps (in seconds), delimited by -. For example 15-15-300 "
 "means \"In case of failure wait 15 seconds, try again, on failure wait 15 "
@@ -259,35 +274,42 @@ msgstr ""
 "ждать еще 15 секунд и снова пробовать, в случае ошибки сделать последнюю "
 "попытку еще через 5 минут\""
 
-#: ussd-widget.py:626
+#: src/usr/lib/hildon-desktop/ussd-widget.py:629
+msgid ""
+"USSD number. To perform USSD menu navigation divide queries vith spacebars. "
+"For xample '*100# 1' means 1st entry in *100# menu."
+msgstr ""
+"USSD номер. Чтобы переходить по пунктам USSD меню разделяйте запросы пробелами. "
+"Например, '*100# 1' означает 1ый пункт в меню *100#."
+
+#: src/usr/lib/hildon-desktop/ussd-widget.py:634
 msgid "Regexp syntax error"
 msgstr "Синтаксическая ошибка в регулярном выражении"
 
-#: ussd-widget.py:631
+#: src/usr/lib/hildon-desktop/ussd-widget.py:639
 msgid "Incorrect USSD number"
 msgstr "Неправильный USSD номер"
 
-#: ussd-widget.py:631
+#: src/usr/lib/hildon-desktop/ussd-widget.py:639
 msgid "USSD number should contain only digits, +, * or #"
 msgstr "USSD номер должен состоять только из цифр, +, * и #"
 
-#: ussd-widget.py:636
+#: src/usr/lib/hildon-desktop/ussd-widget.py:644
 msgid "Incorrect retry pattern"
 msgstr "Неправильный шаблон повторных запросов"
 
-#: ussd-widget.py:636
+#: src/usr/lib/hildon-desktop/ussd-widget.py:644
 msgid "Retry pattern should contain only numbers, delimited by -"
 msgstr "Шаблон повторных запросов должен состоять из чисер, разделенных -"
 
-#: ussd-widget.py:641
+#: src/usr/lib/hildon-desktop/ussd-widget.py:649
 msgid "Choose background color"
 msgstr "Выберите цвет фона"
 
-#: ussd-widget.py:648
+#: src/usr/lib/hildon-desktop/ussd-widget.py:656
 msgid "Choose text color"
 msgstr "Выберите цвет текста"
 
-#: ussd-widget.py:655
+#: src/usr/lib/hildon-desktop/ussd-widget.py:663
 msgid "Choose a font"
 msgstr "Выберите шрифт"
-
index 70f4512..7898b41 100755 (executable)
@@ -315,7 +315,7 @@ class USSD_Controller:
        def call_external_script( self, ussd_code, language ):
                self.cb_ready = 0
                self.cb_reply = "";
-               p = Popen(['/usr/bin/ussdquery.py', ussd_code, ussd_languages[language]], stdout=PIPE)
+               p = Popen(['/usr/bin/ussdquery.py', ussd_code, "-l", ussd_languages[language]], stdout=PIPE)
                gobject.io_add_watch( p.stdout, gobject.IO_IN | gobject.IO_PRI | gobject.IO_HUP | gobject.IO_ERR , self.callback_ussd_data )
 
        def ussd_renew(self, widget, event):
@@ -485,6 +485,9 @@ class UssdConfigDialog(gtk.Dialog):
 
                retryhelp = gtk.Button("?")
                retryhelp.connect("clicked", self.on_show_retryhelp)
+               
+               numberhelp = gtk.Button("?")
+               numberhelp.connect("clicked", self.on_show_number_help)
 
                area = hildon.PannableArea()
                self.vbox.add(area)
@@ -495,8 +498,10 @@ class UssdConfigDialog(gtk.Dialog):
                numberLabel = gtk.Label(_("USSD number"))
                numberLabel.set_alignment(0,0)
                numberLabel.set_size_request(100, -1)
+               numberhelp.set_size_request(1, -1)
                self.ussdNumber.set_size_request(200, -1)
                numberBox.add(numberLabel)
+               numberBox.add(numberhelp)
                numberBox.add(self.ussdNumber)
                vbox.add(numberBox)
 
@@ -524,8 +529,6 @@ class UssdConfigDialog(gtk.Dialog):
                vbox.add(self.parser)
                
                b_parserBox = gtk.HBox()
-#              parserLabel = gtk.Label(_("Parser"))
-#              parserLabel.set_alignment(0,0)
                self.show_box.set_size_request(200, -1)
                bphelp.set_size_request(10, -1)
                b_parserBox.add(self.show_box)
@@ -622,6 +625,11 @@ class UssdConfigDialog(gtk.Dialog):
                dialog.run()
                dialog.destroy()
        
+       def on_show_number_help(self, widget):
+               dialog = pHelpDialog(_("Format help"), _("USSD number. To perform USSD menu navigation divide queries vith spacebars. For xample '*100# 1' means 1st entry in *100# menu."))
+               dialog.run()
+               dialog.destroy()
+       
        def on_error_regexp(self, error):
                dialog = pHelpDialog(_("Regexp syntax error"), error )
                dialog.run()
@@ -705,7 +713,7 @@ def check_regexp(regexp):
 
 def check_number(number):
        for s in number :
-               if not (s in ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "+", "*", "#"]) :
+               if not (s in ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "+", "*", "#", " "]) :
                        return False
        return True
 
@@ -757,6 +765,7 @@ class UssdWidgetPlugin(hildondesktop.HomePluginItem):
                if config[6]:
                        self.controller.ussd_renew(self, None)
 
+               self.label.modify_font(config[8])
                self.controller.reset_timed_renew()
                hildondesktop.HomePluginItem.do_show(self)
        
index 160c781..8288211 100644 (file)
Binary files a/ussd-widget/src/usr/share/locale/ru/LC_MESSAGES/ussd-widget.mo and b/ussd-widget/src/usr/share/locale/ru/LC_MESSAGES/ussd-widget.mo differ